hdu4763kmp

题意 给出一个串,求出最长的一个字串,使得他是原串的前缀,也是后缀,并且在中间也能找到一个该串,三个串不能重合;
利用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;
}

    原文作者:B树
    原文地址: https://blog.csdn.net/aonaigayiximasi/article/details/50978468
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞