Theme Section

题目大意:给你一个串,从这个串里面找出一个前缀后缀中间相等的串的最大长度也就是 EAEBE,每个字母都代表一个串,E出现了三次,找出最长的那个E。

 
分析:我们知道KMP里面保存的就是前缀和后缀的最大匹配度,如果在这匹配度中间再找一个串也让他等于这个匹配度,那么一定就是最大值,如果找不到就回朔next,其实还是挺暴力的做法,不过很意外时间用的并不多。
 
代码如下:
=====================================================================================================================
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

const int MAXN = 1e6+7;
const int oo = 1e9+37;

char s[MAXN];
int Next[MAXN];

void GetNext(int N)
{
    int i=0, j=-1;
    Next[0] = -1;

    while(i < N)
    {
        if(j == -1 || s[i]==s[j])
            Next[++i] = ++j;
        else
            j = Next[j];
    }
}
bool KMP(int start, int End)
{
    int i = 0, j = start;

    while(i < start && j<End)
    {
        while(i==-1 || (s[i] == s[j] && i<start) )
            i++, j++;

        if(i == start)
            return true;
        i = Next[i];
    }

    return false;
}

int main()
{
    int T;

    scanf("%d", &T);

    while(T--)
    {
        scanf("%s", s);

        int N = strlen(s);
        GetNext(N);

        int j = N;

        while(Next[j] > 0)
        {
            if(KMP(Next[j], N-Next[j]) == true)
                break;
            j = Next[j];
        }

        printf("%d
", Next[j]);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/liuxin13/p/4750214.html