HDU-1358 Period (kmp)

来源:互联网 发布:朋友圈关系网软件 编辑:程序博客网 时间:2024/05/18 00:07

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=1358

题意:

给出一段序列,求这段字符串的所有前缀中有哪些是循环串,输出这些前缀的位置和循环周期。

思路:

与hdu3746基本相同,就是利用next[]数组来求循环节长度判断是否是循环串。

代码:

#include <bits/stdc++.h>#define PI acos(-1.0)#define INF 0x3f3f3f3f#define MOD 1000000007#define EPS 1e-6#define N 1123456using namespace std;int n,m,sum,res,flag;void getNext(char *pre, int len, int *next){    int i = 0,j = -1;    next[0] = -1;    while(i < len)    {        if(j == -1 || pre[i] == pre[j])        {            i++,j++;            next[i] = j;        }        else   j = next[j];    }}char s[N];int main(){    int i,j,k,kk,cas,T,t,x,y,z;    cas=0;    while(scanf("%d",&n)!=EOF&&n)    {        printf("Test case #%d\n",++cas);        scanf("%s",s);        n=strlen(s);        int a[n+1];        getNext(s,n,a);        for(i=2;i<=n;i++)        {            t=i-a[i];            if(i!=t&&i%t==0)printf("%d %d\n",i,i/t);        }        printf("\n");    }    return 0;}








0 0
原创粉丝点击