码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-08-17 00:43:34      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:分享图片   表示   define   alt   应用   fine   ==   img   前缀   

给定一个字符串,求出一个前缀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\n", ans);
        }

}

 

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

标签:分享图片   表示   define   alt   应用   fine   ==   img   前缀   

原文地址:https://www.cnblogs.com/ruthank/p/9490900.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!