kmp练习poj1961

来源:互联网 发布:淘宝专柜价是正品吗 编辑:程序博客网 时间:2024/06/10 21:22

题意
求出所有前缀串的最小循环节长度

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 1000005;char p[maxn];int f[maxn];int main(){    int n,cas = 1;    while(scanf("%d",&n) && n)    {        scanf("%s",p);        f[0] = f[1] = 0;        int len = strlen(p);        for(int i=1; i<len; i++)        {            int j = f[i];            while(j && p[i] != p[j]) j = f[j];            if(p[i] == p[j]) f[i+1] = j + 1;            else f[i+1] = 0;        }        printf("Test case #%d\n",cas++);        for(int i = 2; i<=len; i++)        {            int x = i - f[i];            if(f[i] && i%x == 0)                printf("%d %d\n",i,i/x);        }        printf("\n");    }    return 0;}
0 0
原创粉丝点击