mancher算法 算是对这个算法的复习。这个算法核心就是回文串左右对称,所以左右对称位置处的字符的回文半径也相等,但是要注意的细节是,这里存的半径是包含中心点的。比如说 1 2 3 2 1 那么半径是3而不是2.
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
char s1[N];
char s2[N * 2];
int p[N*2];
int main (){
// cin >> s1 ;
// cout <<s1 << endl;
cin.getline(s1+1,N);
int len = strlen(s1+1);
//cout <<s1 << ' ' << len << endl;
for(int i=1;i<=len;i++){
s2[i*2] = s1[i];
s2[i*2-1] = '#';
// cout << i << ' ' <<s1[i] << endl;
}
// cout << "s12" << s1[2] << endl;
//cout << "s24" << s2[4] << endl;
s2[len*2 + 1] = '#';
len = len * 2 + 1;
for(int i=1,l=1,r=0;i<=len;i++){
// cout << i << ' ' << l << ' ' << r << ' ' << s2[i] << endl;
int k = (i>r) ? 1 : min(r - i , p[l + r - i]);
while(i -k >=1&&i + k <=len&&s2[i-k] == s2[i + k]) k ++ ;
p[i] = k-- ;
if(i + k > r) {
l = i - k ;
r = i + k ;
}
}
int res = 0 ;
for(int i=1;i<=len;i++){
// cout << i << ' ' << p[i] << endl;
res = max(res,p[i]-1);
}
cout << res << endl;
return 0;
}