[poj2406]Power Strings
有两种方法,第一种直接KMP求出next数组,然后发现这样的重复一定是满足s[0,l)+s[l,r)+s[r,len),其中因为有s[0,l)=s[r,len),那么就有s[0,r)=s[l,len),又因为需要l尽量小,那么r就应该尽量大,即next[len]。
考虑如何判断next是否合法,仅需要满足$len\equiv 0(mod\ len-next[len])$即可,而如果next不可以,显然所有都不可以,即答案为1。
还有就是后缀数组,发现有等式$next[len]=lcp(s[0],s[len-next[len]])$,同理计算即可(求后缀数组需要用dc3求,否则会超时)。

1 #include<cstdio> 2 #include<cstring> 3 int n,nex[1000005]; 4 char s[1000005]; 5 int main(){ 6 while (scanf("%s",s)!=EOF){ 7 if (s[0]=='.')return 0; 8 n=strlen(s); 9 for(int i=1,j=0;i<n;i++){ 10 while ((j)&&(s[j]!=s[i]))j=nex[j]; 11 j+=(s[j]==s[i]); 12 nex[i+1]=j; 13 } 14 if (n%(n-nex[n])==0)printf("%d\n",n/(n-nex[n])); 15 else printf("1\n"); 16 } 17 }