poj 2406
这个题的主要关键在于如何使用KMP求循环节的问题
KMP主要关键在于跳next数组,假设数组长度是lens,那么如果有循环节的话,循环节的长度一定是lens-next[lens],因为这样对于第一个循环节之外字符串,就能实现
s[i]=s[i+lens-next[lens]];
贴代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define MAXN 1000010 6 using namespace std; 7 char s[MAXN]; 8 int next[MAXN]; 9 //每一个字符串的循环节是lens-next[lens] 10 int main() 11 { 12 while(scanf("%s",s+1)!=EOF) 13 { 14 if(s[1]=='.') break;//怎么感觉题目中并没有提这样的要求,难道我眼拙? 15 int lens=strlen(s+1); 16 next[1]=0; 17 for(int i=2,j=0;i<=lens;i++) 18 { 19 while(j&&s[i]!=s[j+1]) j=next[j]; 20 if(s[i]==s[j+1]) j++; 21 next[i]=j; 22 } 23 if(lens%(lens-next[lens])==0) printf("%d\n",lens/(lens-next[lens])); 24 else printf("1\n"); 25 } 26 }

浙公网安备 33010602011771号