分析:
manacher求最长回文字串
代码:
使用cin,cout的话需加上ios::sync_with_stdio(false);否则会超时。
#include <iostream>
using namespace std;
const int maxn = 110010;
char s[maxn], t[2 * maxn];
int p[2 * maxn];
void manacher()
{
for (int id = 0, mx = 0, i = 1; t[i] != '\0'; ++i) {
p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;
while (t[i + p[i]] == t[i - p[i]]) p[i]++;
if (i + p[i] > mx) {
mx = i + p[i];
id = i;
}
}
}
int main()
{
ios::sync_with_stdio(false);
while (cin >> s) {
t[0] = '$';
int i;
for (i = 0; s[i] != '\0'; ++i ) {
t[2 * i + 1] = '#';
t[2 * i + 2] = s[i];
}
t[2 * i + 1] = '#';
t[2 * i + 2] = '\0';
manacher();
int ans = 0;
for (i = 1; t[i] != '\0'; ++i) {
ans = max(ans, p[i]);
}
cout << ans - 1 << endl;
}
return 0;
}