power strings

题目大意:

             求每个字符串的最短循环子串,输出循环次数。

             到'.'时停止。

 

发现KMP算法中的next数组恰好满足这个性质,如果n%(n-next[n])==0,则为好几个的循环,输出

n/(n-next[n]),否则放心输出1。

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=1e6+7;
 6 char a[maxn];
 7 int n;
 8 int P[maxn];
 9 void process(){
10     int j=0;
11     for(int i=1;i<=n;i++){
12         while(j>0&&a[j+1]!=a[i+1]) j=P[j];
13         if(a[j+1]==a[i+1]) j++;
14         P[i+1]=j;
15     }
16 }
17 int main(){
18     for( ; ; ){
19         scanf("%s",a+1);
20         if(a[1]=='.') break;
21         n=strlen(a+1);
22         process();
23         if(n%(n-P[n])==0){
24             cout<<n/(n-P[n])<<endl; 
25         } 
26         else cout<<1<<endl;
27     } 
28     return 0;
29 } 

在洛谷上用next会说ambiguous

所以换个.......

 

posted @ 2018-08-03 15:52  lcan  阅读(126)  评论(0编辑  收藏  举报