HDU 4763 kmp

来源:互联网 发布:flash软件百度云 编辑:程序博客网 时间:2024/06/08 11:09

给一个字符串,问最长的一个子串A,他是前缀,同时是后缀,并且中间也出现过A。并且出现的三个A都不没有重叠部分。

#include <bits/stdc++.h>using namespace std;const int maxn = 1e6+5;char p[maxn];int nex[maxn];void getNext (char p[]) {    int m=strlen(p+1);    nex[1]=0;    for(int k=0,q=2;q<=m;q++)    {        while(k>0 && p[k+1]!=p[q]) k=nex[k];        if(p[k+1]==p[q]) k++;        nex[q]=k;    }}bool kmp (int l, int r, int len){    for (int q=l,k=0; q<=r;q++)    {        while (k> 0 && p[k+1] != p[q])k = nex[k];        if (p[k+1] == p[q]) k++;        if (k == len) return true;    }    return false;}int main () {    int cas;    scanf("%d", &cas);    while (cas--)    {        scanf("%s", p+1);        int  n = strlen(p+1);        getNext(p);         int len = nex[n];        while (len) {             if (kmp(2, n-1, len)) break;            len = nex[len];        }        printf("%d\n", len);    }    return 0;}


原创粉丝点击