MnZn刚学Manacher 8pts求助,悬1关

P3805 【模板】manacher

@[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


|