题目链接:传送门
一个多组数据的manacher,,
manacher的个人理解之后会发
/**
* @Date: 2019-03-10T18:56:14+08:00
* @Last modified time: 2019-03-10T20:26:33+08:00
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <complex>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define
#define
using namespace std;
typedef long long ll;
char tmp[A >> 1], s[A];
int mx, id, p[A], n, ans, T;
void manacher() {
for (int i = 0; i <= n; i++) {
if (id + mx > i) p[i] = min(p[id * 2 - i], id + mx - i);
while (i - p[i] > 0 and i + p[i] < n and s[i - p[i] - 1] == s[i + p[i] + 1]) ++p[i];
if (i + p[i] > mx + id) {
mx = p[i];
id = i;
}
ans = max(ans, p[i]);
}
printf("%d\n", ans);
}
int main(int argc, char const *argv[]) {
scanf("%d", &T);
while (T--) {
memset(p, 0, sizeof p);
scanf("%s", tmp); int lex = strlen(tmp);
mx = -1, id = 0, n = -1, ans = 0;
for (int i = 0; i < lex; i++) s[++n] = '#', s[++n] = tmp[i]; s[++n] = '#';
manacher();
}
}