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数组的应用)的主要内容,如果未能解决你的问题,请参考以下文章