题目 https://cn.vjudge.net/problem/POJ-2406
题意
用next数组求出整个数组的最大前缀,如果整个串是用循环节组成的,那么 n - next[n] 也就是最小循环节,验证最小循环节会被n整出。
思路
利用KMP算法,求字符串的特征向量next,若len可以被len - next[len]整除,则最大循环次数n为len/(len - next[len]),否则为1。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int nex[1000005];
char s[2000006];
void kmpNext(char *p)
{
int t = nex[0] = -1;
int n =strlen(p);
int j = 0;
while(j<n)
{
if(t== -1||p[t]==p[j])
{
j++;
t++;
nex[j] = t;
}
else
t = nex[t];
}
}
int main()
{
while(scanf("%s",s) != EOF)
{
if(s[0] == '.')
{
break;
}
memset(nex,0,sizeof(nex));
kmpNext(s);
int len = strlen(s);
if(len%(len - nex[len]) == 0)
{
printf("%d\n",len/(len-nex[len]));
}
else
printf("1\n");
}
return 0;
}