kmp 公共子串出现3次

来源:互联网 发布:mac无法搜索移动硬盘 编辑:程序博客网 时间:2024/05/16 09:27

怎么那么巧妙。。自己没有想到。
转自http://www.cnblogs.com/19992147orz/p/6284076.html

#include<iostream>#include<map>#include<algorithm>#include<string>#include<cstring>#include<cstdio>#include<iomanip>using namespace std;const int maxn=1000005;char s[maxn];int nxt[maxn];int used[maxn];void getnext(){    int len=strlen(s);    int k=-1;    int j=0;    nxt[0]=-1;    while(j<=len-1){        if(k==-1||s[j]==s[k]){            j++;            k++;            nxt[j]=k;        }        else{            k=nxt[k];        }    }}void init(){    memset(used,0,sizeof(used));    memset(nxt,0,sizeof(nxt));}int main(){    while(cin>>s){            init();    getnext();    int len=strlen(s);    for(int i=1;i<=len-1;i++)used[nxt[i]]=1;//用这方法就巧妙地处理了中间有公共子串的情况    used[0]=0;    for(int i=len;i!=-1;i=nxt[i])        if(used[nxt[i]]){            for(int j=0;j<nxt[i];++j)cout<<s[j];            cout<<endl;            return 0;        }    printf("Just a legend\n");    }}
0 0
原创粉丝点击