POJ 2406 kmp + 循环节

来源:互联网 发布:s7300模拟量编程 编辑:程序博客网 时间:2024/06/06 18:49

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");    }}
原创粉丝点击