poj-1961-Period

来源:互联网 发布:淘宝上买iphone店铺 编辑:程序博客网 时间:2024/04/30 06:08

本题大意:求一个字符串的当前长度为len的字串的最大重复字串数。输出当前位置和数量!

地址:http://poj.org/problem?id=1961

这个题要用到KMP算法中的next[]数组!


代码如下:


#include<stdio.h>#include<string.h>#include<iostream>using namespace std;const int maxn=5201314;char ss[maxn];int next[maxn];void getnext(int len){//next[i]可以描述为"不为自身的最大首尾重复子串长度"!    next[0]=-1;    int i=0,j=-1;    while(i<len)    {        if(j==-1||ss[i]==ss[j])        next[++i]=++j;        else        j=next[j];    }}int main(){    int len,ji=1;    while(cin>>len)    {        if(len==0)        break;        cin>>ss;        getnext(len);        //for(int i=1;i<=len;i++)        //cout<<next[i]<<" ";        //cout<<endl;        printf("Test case #%d\n",ji++);        for(int i=2;i<=len;i++)        {            int length=i-next[i];            if(i%length==0&&i!=length)            cout<<i<<" "<<i/length<<endl;        }        cout<<endl;    }    return 0;}



0 0
原创粉丝点击