全都开longlong了,循环变量都开了,除了int main()找不到一个int了
算法:马拉车+二分。
#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const long long N=1000050;
long long n;
ull h1[N],h2[N],p[N];
ull geth(ull *h,long long l,long long r){
return h[r]-h[l-1]*p[r-l+1];
}
bool check(long long l,long long r){
return geth(h1,l,r)==geth(h2,n-r+1,n-l+1);
}
long long ef(long long i){
int l=0,r=n,ans=0;
while(l<=r){
int mid=(l+r)/2;
if(check(i-mid+1,i+mid)){
l=mid+1;
ans=mid;
}else r=mid-1;
}
return ans;
}
int main(){
p[0]=1;
cin>>n;
char s[N];
scanf("%s",s+1);
n=strlen(s+1);
// s=' '+s;
for(long long i=1;i<=n;i++){
h1[i]=h1[i-1]*2+(s[i]=='1');
h2[i]=h2[i-1]*2+(s[n-i+1]=='0');
p[i]=p[i-1]*2;
}
// for(int i=1;i<=n;i++){
// cout<<i<<":"<<h1[i]<<","<<h2[i]<<","<<p[i]<<endl;
// }
// cout<<check1(3-2,3)<<","<<check2(3,3+2);
// cout<<check1(1,3)<<" "<<check2(3,5)<<endl;
long long ans=0;
for(long long i=1;i<=n;i++) ans+=ef(i);
cout<<ans;
return 0;
}
PS:违规请先提醒我一下OTZ