http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=10758
思路:KMP,next表示模式串如果第i位(設str[0]為第0位)與文本串第j位不匹配則要回到第next[i]位繼續與文本串第j位匹配。則模式串第1位到next[n]與模式串第n-next[n]位到n位是匹配的。所以思路和上面一樣,如果n%(n-next[n])==0,則存在重復連續子串,長度為n-next[n]。
例如:a b a b a b
next:-1 0 0 1 2 3 4
next[n]==4,代表着,前綴abab與后綴abab相等的最長長度,這說明,ab這兩個字母為一個循環節,長度=n-next[n];
#include<iostream>
#include<string.h>
using namespace std;
int next[1000005];
char s[1000005];
void getnext()
{
int i=0,j=-1;
next[0]=-1;
int len=strlen(s);
while(i<len)
{
if(s[i]==s[j]||j==-1)
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int main()
{
while(scanf("%s",s)>0)
{
if(s[0]=='.')
break;
int len=strlen(s);
getnext();
if(len%(len-next[len])==0)
printf("%d\n",len/(len-next[len]));
else
printf("1\n");
}
return 0;
}
