UVA1328Period(最小循环节)

https://cn.vjudge.net/problem/UVA-1328

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1000005
int f[maxn];
char t[maxn];
using namespace std;
int n;
void getfail(char*t,int*f)
{
    f[0]=f[1]=0;
for(int i=1;i<n;i++)
{
    int j=f[i];
    while(j&&t[i]!=t[j])
        j=f[j];
    f[i+1]=(t[i]==t[j])?j+1:0;
}
}
int main()
{int w=0;
    while(~scanf("%d",&n)&&n)
    {memset(f,0,sizeof(f));
        scanf("%s",t);
        w++;

        getfail(t,f);
   printf("Test case #%d\n",w);

        for(int i=2;i<=n;i++)
           if(f[i]>0&&i%(i-f[i])==0)
                printf("%d %d\n",i,i/(i-f[i]));
                printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sdauguanweihong/article/details/83927794
今日推荐