1358(Period)字符串匹配-KMP

来源:互联网 发布:淘宝开店无忧是真的吗 编辑:程序博客网 时间:2024/06/05 14:17

题目要求字符串中子串循环次数

根据NEXT数组的循环节性质,len%(len-next[len])==0,说明字符串循环了,当然NEXT=0这个不算,循环次数要求大于1。

#include<iostream>using namespace std;#define Max 1000005int nextt[Max];char s[Max];void Getnext(int n){    int i,j;    i=0,j=-1;    nextt[0]=-1;    while(i<n)    {        if(j==-1 || s[i]==s[j])        {            i++;            j++;            nextt[i]=j;        }        else j=nextt[j];    }}int main(){    int n,i,count=1;    while(cin>>n)    {        if(n==0) break;        cin>>s;        Getnext(n);        cout<<"Test case #"<<count++<<endl;        //for(i=1;i<=n;i++) cout<<next[i]<<" ";        //cout<<endl;        for(i=2;i<=n;i++)        {            if(i%(i-nextt[i])==0 && i/(i-nextt[i])>1)            {                cout<<i<<" "<<i/(i-nextt[i])<<endl;            }        }        cout<<endl;    }    return 0;}



0 0
原创粉丝点击