思路:裸的马拉车算法,,,后缀数组应该也可以做
Manacher:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1005 * 2;
int Manacher(string a)
{
int len = a.size(), id = 0, MAX = 0, ans = -1, p[MAXN];
memset(p, 0, sizeof(p));
string s = "$#";
for (int i = 0; i < len; i++){ s += a[i]; s += '#'; }
len = len * 2 + 1;
for (int i = 1; i <= len; i++)
{
if (MAX > i) p[i] = max(p[2 * id - i], MAX - i);
else p[i] = 1;
while(s[i - p[i]] == s[i + p[i]]) p[i]++;
ans = max(ans, p[i]);
if(MAX < p[i] + i)
{
MAX = p[i] + i;
id = i;
}
}
return ans - 1;
}
int main()
{
string s;
getline(cin, s);
printf("%d", Manacher(s));
return 0;
}
/*
Is PAT&TAP symmetric?
*/