题意:找串的最长回文字串(连续)
题解:manacher版题
一些理解:首位加上任意两个字符是为了判断边界。
本算法主要是为了
1.省去奇偶分类讨论。
2.防止形如aaaaaaa的串使得暴力算法蜕化为n^2;
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<queue> #include<algorithm> #include<iostream> #include<vector> #include<string.h> using namespace std; const int maxn = 3e5;; char s[maxn], str[maxn]; int len1, len2, p[maxn], ans; void init() { str[0] = '$'; str[1] = '#'; for (int i = 0; i < len1; i++) { str[i * 2 + 2] = s[i]; str[i * 2 + 3] = '#'; } len2 = len1 * 2 + 2; str[len2] = '*'; } void manacher() { int id = 0,mx = 0; for (int i = 1; i < len2; i++) { if (mx > i)p[i] = min(p[2 * id - i], mx - i); else p[i] = 1; for (; str[i + p[i]] == str[i - p[i]]; p[i]++); if (p[i] + i > mx) { mx = p[i] + i; id = i; } } } int main() { while (scanf("%s", s) != EOF) { len1 = strlen(s); init(); ans = 0; manacher(); for (int i = 0; i < len2; i++) { ans = max(ans, p[i]); } cout << ans-1 << endl; } }