在P3805第一个点是wa的,数据是
input
hbhbbhhhhbbhhhhbhbhhbhhhhhbhhhhbbbhbbbbhbhhbhhhbbbhbhbbbbbbb
output
12
我的程序:
#include<bits/stdc++.h>
using namespace std;
//char buf[1<<18],*p1=buf,*p2=buf;
//#define getchar() (p1==p2&&(p1=buf,p2=p1+fread(buf,1,1<<18,stdin),p1==p2)?EOF:*p1++)
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
inline void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
const int N=1e7+5;
unsigned long long f[N],pw[N],ff[N];
int n;
unsigned long long hs1(int l,int r){
return f[r]-f[l-1]*pw[r-l+1];
}
unsigned long long hs2(int l,int r){
return ff[r]-ff[l-1]*pw[r-l+1];
}
bool ck(int ln,int mid){
if(mid+ln>n) return 0;
if(mid-ln<1) return 0;
if(!ln) return 1;
int lft=hs1(mid-ln,mid-1),rht=hs2(n-(mid+ln)+1,n-(mid+1)+1);
return (lft==rht);
}
char s[N];
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
scanf("%s",s+1);
n=strlen(s+1);
int ans=1;
for(int i=2*n;i>=1;i-=2) s[i]=s[i/2],s[i-1]=(char)('z'+1);
n*=2;
f[0]=1,ff[0]=1,pw[0]=1;
for(int i=1;i<=n;i++)
f[i]=f[i-1]*131+s[i]-'a'+1,pw[i]=pw[i-1]*131;
int cnt=0;
for(int i=n;i>=1;i--) ff[++cnt]=ff[cnt-1]*131+s[i]-'a'+1;
for(int i=1;i<=n;i++){
int l=0,r=n;
while(l<r){
int mid=(l+r)>>1;
if(ck(mid,i)) l=mid+1;
else r=mid;
}
int rs=(l-1);
if(s[i-rs]=='z'+1) ans=max(ans,rs);
else ans=max(ans,rs+1);
}
printf("%d",ans);
return 0;
}//ababa
本地跑输出是正确的,求问这是为什么