【uva1328】Period

来源:互联网 发布:网络对青少年的利与弊 编辑:程序博客网 时间:2024/06/07 17:46

题目链接:https://vjudge.net/problem/UVA-1328
题解
KMP
i-next【i】为最小循环节
每次判断能否除尽且不是它本身即可

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=1000010;int nxt[N],len,T;char str[N];void Get_nxt(char *s,int len){    for(int i=2,j=0;i<=len;i++)    {        while(j&&s[j+1]!=s[i]) j=nxt[j];        j+=(s[j+1]==s[i]);        nxt[i]=j;        if(nxt[i]&&(i%(i-nxt[i]))==0) printf("%d %d\n",i,i/(i-nxt[i]));    }    cout<<endl;}int main(){    while(scanf("%d",&len)&&len)    {        scanf("%s",str+1);        printf("Test case #%d\n",++T);        Get_nxt(str,len);    }    return 0;}