这是一个hash+二分求最长回文子串的错误代码
  • 板块灌水区
  • 楼主chang_an_1029
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/11/29 15:08
  • 上次更新2024/11/29 18:10:42
查看原帖
这是一个hash+二分求最长回文子串的错误代码
725327
chang_an_1029楼主2024/11/29 15:08

在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

本地跑输出是正确的,求问这是为什么

2024/11/29 15:08
加载中...