1. 程式人生 > >[POJ1961]Period (KMP)

[POJ1961]Period (KMP)

題意

求字串s的最小迴圈元長度和迴圈次數

思路

s[1~i]滿足迴圈元要len能整除i並且s[len+1~i]=s[1~i-len]

程式碼

#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 1000005
using namespace std;
char s[N];
int next[N];
int n,T;
int len;
void kmp()
{
    next[1]=0;
    for(int i=2,j=0;i<=len;i++)
    {
        
while(j>0&&s[i]!=s[j+1]) j=next[j]; if(s[i]==s[j+1]) j++; next[i]=j; } } int main() { while(scanf("%d",&n)==1&&n) { scanf("%s",s+1); len=strlen(s+1); kmp(); printf("Test case #%d\n",++T); for(int i=2
;i<=n;i++) { if(i%(i-next[i])==0 && i/(i-next[i])>1) printf("%d %d\n",i,i/(i-next[i])); } puts(""); } return 0; }