HDU - 4763 Theme Section (KMP的next数组的应用)

Posted ruthank

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 4763 Theme Section (KMP的next数组的应用)相关的知识,希望对你有一定的参考价值。

给定一个字符串,求出一个前缀A,使得字符串的构成可以表示成ABABA的形式(B可以为空串)。

输出这个前缀的最大长度。

技术分享图片

 

 

 

KMP算法Next数组的使用。

枚举中间的每个位置,可以根据Next数组求出这个位置对应的前缀。然后暴力判断前缀与后缀是否相等即可。

技术分享图片

如图,枚举的位置为 i,则Next[i] = j,。然后判断0~j 是否和 k~len是否是相同的。

注意要判断合法性,即前缀 + 中缀的长度不能比当前枚举的位置大,且后缀开始的位置一定要比当前枚举的位置大。

判定完Next[i]后,一定要判定Next[ Next[i] ],这样递归下去,看看大的如果不符合,小的是否符合。

然而复杂度,我不会证明。

 

 

 

#include <bits/stdc++.h>
using namespace std;
#define maxn 1000010

int Next[maxn];


void GetNext(char s[], int len)
{
        Next[0] = -1;
        int j = -1;
        for (int i = 1; i < len; i++)
        {
                while(j > -1 && s[j+1] != s[i])
                        j = Next[j];
                if (s[j+1] == s[i]) j++;
                Next[i] = j;
        }
}

int main()
{
        int n;
        scanf("%d", &n);
        for (int ca = 1; ca <= n; ca++)
        {
                char s[maxn];
                scanf("%s", s);
                int len = strlen(s), ans = 0;
                GetNext(s, len);//求出Next数组

                for (int i = len-1; i >= 0; i--)
                {
                        int j = i;
                        while(j > -1)
                        {
                                if ((j+1)*2 <= i+1 && len - (j+1) > i)//判断相互的位置的合法性
                                {
                                        int flag = 1;
                                        for (int k = 0; k < j+1; k++)
                                                if (s[len - (j+1) + k] != s[k])
                                                {
                                                        flag = 0;
                                                        break;
                                                }
                                        if (flag) //前缀和后缀匹配
                                                ans = max(ans, j+1);
                                }
                                j = Next[j]; //判断比它小的是否符合
                        }
                }
                printf("%d
", ans);
        }

}

 

以上是关于HDU - 4763 Theme Section (KMP的next数组的应用)的主要内容,如果未能解决你的问题,请参考以下文章

hdu4763 Theme Section

hdu4763Theme Section

HDU 4763 - Theme Section(KMP)

HDU4763-Theme Section(KMP+二分)

HDU-4763 Theme Section KMP

Theme Section HDU - 4763(些许暴力)