hdu4763kmp

来源:互联网 发布:js 控制class active 编辑:程序博客网 时间:2024/06/06 10:36

题意 给出一个串,求出最长的一个字串,使得他是原串的前缀,也是后缀,并且在中间也能找到一个该串,三个串不能重合;
利用KMP的next数组,通过自己匹配自己,next[i]代表了前i的字符前缀和后缀相等的最长长度,从len-1往前暴力

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;const int maxn=1e6+10;char s[maxn];int nex[maxn];void getnext(){    int i=0,j=-1;    nex[0]=-1;    int len=strlen(s);    while(i<len)    {        if(j==-1||s[i]==s[j])        {            i++;j++;            nex[i]=j;        }        else        j=nex[j];    }}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%s",s);        getnext();        int len=strlen(s);        int m=nex[len];        int ans=0;        for(int i=len-1;i>=2;i--)        {            int k=nex[i];            while(k>0)            {                if(k<=m&&k+k<=i&&i+k<=len)                {                    ans=max(ans,k);                    break;                }                k=nex[k];            }        }        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击