kmp + 循环节
题意:
给出一个字符串求出它是由几个循环节组成的。
思路:
若一个字符串有循环节,那么整个字符串前缀与后缀相同的最长长度就是循环节的个数-1,并且总的字符串长度可以除尽循环节长度。根据这两条性质利用Next取判断即可。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1e6 + 10;
char mo[maxn];
int Next[maxn];
void getNext()
{
int i = 0,j = -1,l1 = strlen(mo);
Next[0] = -1;
while(i < l1) {
if(j == -1 || mo[i] == mo[j]) Next[++i] = ++j;
else j = Next[j];
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%s",mo) != EOF) {
if(strcmp(mo,".") == 0) break;
getNext();
int len = strlen(mo);
if(len%(len-Next[len]) == 0)
printf("%d\n",len/(len-Next[len]));
else printf("1\n");
}
}