Period UVA - 1328(kmp求循环节)

    科技2024-06-26  61

    Period UVA - 1328

    题意:

    给你一个串。要求你计算每个前缀是否可以由一个循环节,重复k次得到(k>1)

    思路:

    就是模板题。 后缀函数的定义,“错位部分”长度为 i − n e x t [ i ] i-next[i] inext[i]. 如果这 i i i个字符串组成一个周期串,那么“错位”部分恰好就是一个循环节。

    条件.

    k>1. k ( i − n e x t [ i ] ) = i k(i-next[i])=i k(inext[i])=i

    证明

    AC

    #include <iostream> #include <cstring> #include <string> using namespace std; const int maxn=1e6+10; int nxt[maxn]; char s[maxn]; void getnxt(char *p){ int m = strlen(p); int i=0,j=-1; nxt[0]=-1; while(i<m){ if(j==-1||p[i]==p[j])nxt[++i]=++j; else j=nxt[j]; } } int main() { ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n,kase=0; while(cin>>n&&n){ cin>>s; getnxt(s); cout<<"Test case #"<<++kase<<endl;//1" for(int i=2; i<=n; i++){ if(nxt[i]>0 && i%(i-nxt[i])==0)cout<<i<<' '<<i/(i-nxt[i])<<endl; } cout<<endl; } return 0; } /* 3 aaa 12 aabaabaabaab 0 */
    Processed: 0.010, SQL: 8