#include <bits/stdc++.h>
using namespace std;
string s;
typedef unsigned long long ULL;
ULL H1[500010],H2[500010],powB[500010];
const int B=131;
ULL cal(int l,int r,ULL H[]){
return H[r]-H[l-1]*powB[r-l+1];
}
int main(){
int n;
cin >> n;
cin>>s;
powB[0]=1;
for(int i=1;i<=n;i++) powB[i]=powB[i-1]*B;
string t=s;
for(int i = 0; i < s.size(); i++) {
if(t[i] == '0') t[i] = '1';
else t[i] = '0';
}
reverse(t.begin(),t.end());
cout << t << endl;
t="#"+t;
s="#"+s;
for(int i=1;i<=n;i++){
H1[i]=H1[i-1]*B+s[i]; // s串的前缀哈希
H2[i]=H2[i-1]*B+t[i]; // t串的前缀哈希
}
int l=1,r=n, cnt = 0; //长度为奇数
for(int i = 1; i <= s.size(); i++) {
int mid = 0;//长度
l = 1, r = min(i, n-i+1);
while(l < r) {
mid = (l+r) >> 1;
if(cal(i-mid+1, i+mid-1, H1) == cal(i-mid+1, i+mid-1, H2)) {
l = mid+1;
}
else r = mid-1;
}
cnt += mid;
// cout << mid << endl;
}
// cout << cnt << endl << endl;
//长度为偶数
for(int i = 1; i < s.size(); i++) {
int mid;
l = 2, r = min(i, n-i);
while(l < r) {
mid = (l+r) >> 1;
if(cal(i-mid+1, i+mid, H1) == cal(n - i-mid+1, n - i, H2)) {
l = mid+1;
}
else r = mid-1;
}
cnt += mid;
// cout << mid << endl;
}
cout << cnt;
return 0;
}
有巨佬看出我哪错了吗?我是用字符串哈希做的。全WA