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 }

 

posted @ 2017-06-12 18:42  xinyimama  阅读(77)  评论(0)    收藏  举报