[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 }
View Code

 

posted @ 2019-07-28 10:27  PYWBKTDA  阅读(93)  评论(0编辑  收藏  举报