70,但开long long了
查看原帖
70,但开long long了
354482
Ben幻影楼主2023/7/28 16:10

全都开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

2023/7/28 16:10
加载中...