思路:Manacher算法。 用string输入输出会超时。
算法讲解大家可以看这篇博客:Manacher算法--O(n)回文子串算法
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 110005 * 2;
//int Manacher(string a)
int Manacher(char a[])
{
int len = strlen(a)/*a.size()*/, id = 0, MAX = 0, ans = -1, p[MAXN];
memset(p, 0, sizeof(p));
//string s = "$#";
char s[MAXN] = "$#";
//for (int i = 0; i < len; i++){ s += a[i]; s += '#'; }
for (int i = 0; i < len; i++){ s[i * 2 + 2] = a[i]; s[i * 2 + 3] = '#'; }
len = len * 2 + 1;
for (int i = 1; i <= len; i++)
{
if (MAX > i) p[i] = min(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;
char s[MAXN];
//while (cin >> s)
while (~scanf("%s", s))
{
printf("%d\n", Manacher(s));
}
return 0;
}
/*
aaaa
abab
*/