Manacher算法
a情况
b情况
具体例子
c情况
总结
代码
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
const int N = 1.1e7 + 1;
char ss[N << 1];
int p[N << 1];
int n;
void manacherss(const string& str) {
n = str.size() * 2 + 1;
for (int i = 0, j = 0; i < n; i++) {
ss[i] = (i & 1) == 0 ? '#' : str[j++];
}
}
int manacher(const string& str) {
manacherss(str);
int maxLen = 0;
for (int i = 0, c = 0, r = 0, len; i < n; i++) {
len = r > i ? min(p[2 * c - i], r - i) : 1;
while (i + len < n && i - len >= 0 && ss[i + len] == ss[i - len]) {
len++;
}
if (i + len > r) {
r = i + len;
c = i;
}
maxLen = max(maxLen, len);
p[i] = len;
}
return maxLen - 1;
}
int main() {
string s;
cin >> s;
cout << manacher(s) << '\n';
return 0;
}