社区讨论

双哈希求调 20pts(码风猎奇)

P3667[USACO17OPEN] Bovine Genomics G参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjv1vm1
此快照首次捕获于
2025/11/04 08:58
4 个月前
此快照最后确认于
2025/11/04 08:58
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1007;
const int base1=191,base2=97;
const int mod1=1e9+7,mod2=998244353;
int n,m,l,r,hash1[N][N],hash2[N][N];
int P1[N],P2[N],Vi[N][3],Vj[N][3];
string s[N];

void init(){
	for(int i=1;i<=2*n;++i)
		for(int j=1;j<=m;++j){
			(hash1[i][j]=(hash1[i][j-1]*base1)%mod1+s[i][j-1])%=mod1;
			(hash2[i][j]=(hash2[i][j-1]*base2)%mod2+s[i][j-1])%=mod2;
		}
	P1[0]=P2[0]=1;
	for(int i=1;i<=m;++i){
		P1[i]=P1[i-1]*base1%mod1;
		P2[i]=P2[i-1]*base2%mod2;
	}
}

bool check(int x){
	for(int i=1;i<=n;++i)
		for(int j=n+1;j<=2*n;++j){
			Vi[1][1]=hash1[i][x],Vi[1][2]=hash2[i][x];
			Vj[1][1]=hash1[j][x],Vj[1][2]=hash2[j][x];
			if(Vi[1][1]==Vj[1][1]&&Vi[1][2]==Vj[1][2])
				return false;
			for(int k=2;k+x-1<=m;++k){
				(((Vi[k][1]=Vi[k-1][1]-s[i][k-2]*P1[x-1]%mod1+s[i][k+x-2])%=mod1)+=mod1)%=mod1;
				(((Vi[k][2]=Vi[k-1][2]-s[i][k-2]*P2[x-1]%mod2+s[i][k+x-2])%=mod2)+=mod2)%=mod2;
				
				(((Vj[k][1]=Vj[k-1][1]-s[j][k-2]*P1[x-1]%mod1+s[j][k+x-2])%=mod1)+=mod1)%=mod1;
				(((Vj[k][2]=Vj[k-1][2]-s[j][k-2]*P2[x-1]%mod2+s[j][k+x-2])%=mod2)+=mod2)%=mod2;
				
				if(Vi[k][1]==Vj[k][1]&&Vi[k][2]==Vj[k][2])
					return false;
			}
		}
	return true;
}

signed main(){
	cin>>n>>m;
	for(int i=1;i<=2*n;++i)
		cin>>s[i];
	init();
	l=1,r=m;
	while(l<=r){
		int mid=l+r>>1;
		if(check(mid))
			r=mid-1;
		else l=mid+1;
	}
	cout<<r;
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...