@[Stevehim](/user/759274) 你的 `r` 维护错了吧,这是最右边的端点,不是半径
by Benzenesir @ 2023-08-10 19:00:22
```cpp
#include <bits/stdc++.h>
#define maxn 11000000
using namespace std;
char s[maxn];
char t[maxn * 2 + 1]; //增加分隔符后的子串
int l[maxn * 2 + 1]; // l表示某个点的当前边界
int n;
int ma = 0;
void manacher(){
t[0] = '^';
t[1] = '|';
for(int i = 1; i <= n;i++){ //改变原串
t[2 * i] = s[i];
t[2 * i + 1] = '|';
}
n = n * 2 + 1;
for(int i = 1,r = -1,c = 0;i <= n; i++){
l[i] = (i <= r ? min(l[2 * c - i],r - i) : 1);
while(i - l[i] >= 1 && i + l[i] <= n && t[i + l[i]] == t[i - l[i]]){
l[i]++;
}
if(i + l[i] - 1 > r){
c = i; //切换原点,因为半径更大了
r = i + l[i] - 1;
if(t[i]=='|') ma=max((l[i]-1)/2*2,ma);
else ma=max((l[i]-1)/2*2+1,ma);
}
}
// for(int i=1;i<=n;++i) cout << t[i];
// cout << endl;
// for(int i=1;i<=n;++i) cout << l[i] << endl;
}
int main(){
scanf("%s",s + 1);
n = strlen(s + 1);
manacher();
// for(int i = 1; i <= n; i++){
// ma = max(l[i],ma);
// }
cout << ma;
return 0;
}
```
改了就过了
by Benzenesir @ 2023-08-10 19:00:42
还有算答案算错了
by Benzenesir @ 2023-08-10 19:01:17
@[Benzenesir](/user/258178) 感谢!!![](//图.tk/2)
by Stevehim @ 2023-08-10 19:19:52