题目大意:给你一个串,从这个串里面找出一个前缀后缀中间相等的串的最大长度也就是 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; }