HDU 1358

来源:互联网 发布:spss手机版软件 编辑:程序博客网 时间:2024/06/06 17:38

题意:给你一组字符串,问从第二个位置开始,前n个字符串是否循环,循环的位置,以及循环的次数、

思路:next数组最基本的两大特点之一,找出当前的循环节,以及循环长度、 再判断是否循环,直接输出当前串的长度/循环节的长度便可、唯一需要注意的就是最后多了个换行、

AC代码:

#include<cstdio>#include<cstring>const int maxn=1000000;int lent;char T[maxn];int next[maxn];int cnt;void get_next(){    memset(next,0,sizeof(next));    int i=0;int j=-1;next[0]=-1;    while(i<lent){        if(j==-1||T[i]==T[j])            next[++i]=++j;        else            j=next[j];    }}int main(){    cnt=1;    while(scanf("%d",&lent)&&lent){        scanf("%s",T);        get_next();        printf("Test case #%d\n",cnt++);        for(int i=2;i<=lent;i++){            if(next[i]>0){                if(i%(i-next[i])==0)                    printf("%d %d\n",i,i/(i-next[i]));            }        }        printf("\n");    }    return 0;}


0 0
原创粉丝点击