这个题没想到后面还用二分(而且还有这种二分操作。。。。。) 我太弱了--------- (二分循环节出现位置) 好像可以用马拉车做,复杂度还更优一点。。。。 反正不会。。。。。 #include<cstdio> #include<cstring> #include<map> #include<string> #include<iostream> #include<cmath> #include<algorithm> using namespace std; //可以翻转 int k; int n; char a[500005]; long long pf[500005],has1[500005],has2[500005],has3[500005],p=23333,sum=0;//正着,反着 long cal1(int x,int y){ return has1[y]-has1[x-1]*pf[y-x+1]; } long cal2(int x,int y){ return has2[x]-has2[y+1]*pf[y-x+1]; } long cal3(int x,int y){ return has3[y]-has3[x-1]*pf[y-x+1]; } long long check(int x){ int l=1,r=min(x,n-x); while(l<=r){ int mid=(l+r)/2; //cout<<' '<<x-mid>>n; for(int i=0;i<n>>a[i]; if(a[i]=='1')k=i; } has1[0]=has2[n]=0; for(int i=1;i<=n;i++){ has1[i]=has1[i-1]*p+a[i-1]-'0'; } for(int i=n;i>=1;i--){ has2[i]=has2[i+1]*p+a[i-1]-'0'; } for(int i=1;i<=n;i++){ has3[i]=has3[i-1]*p+a[k]-'0'; } /*for(int i=1;i<=10;i++){ int l,r; cin>>l>>r; cout<</n></x-mid></algorithm></cmath></iostream></string></map></cstring></cstdio>