hdu1358 kmp

来源:互联网 发布:潜入朝鲜知乎 编辑:程序博客网 时间:2024/09/21 06:18

题意:

给出一个字符串,求它循环的每个位置和循环的周期。

aabaabaabaab,第六个位置b,aab是一个循环,共有两个循环,故输出6 2

第二个位置,a是一个循环,共有两个循环,故输出2 2

匹配,kmp,只有本身一个串,得到next数组再判断

//求循环周期#include<stdio.h>#include<string.h>#define maxn 1000010int next[maxn];char str[maxn];void getnext(char *str,int len){int i=1,j=0;next[1]=0;while(i<=len){if(j==0||str[i]==str[j])            next[++i]=++j;else j=next[j];}}int main(){    int T=1,len;    while(scanf("%d",&len)!=EOF)    {        if(len==0)break;        memset(next,0,sizeof(next));        scanf("%s",str+1);        getnext(str,len);        printf("Test case #%d\n",T++);        for(int i=2;i<=len+2;i++)        {            int num=i-(next[i+1]-1);//相隔多少个字母if(i!=num&&i%num==0)//整除了,说明是周期的                printf("%d %d\n",i,i/num);        }        printf("\n");    }    return 0;}



0 0