社区讨论
双哈希求调 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 条回复,欢迎继续交流。
正在加载回复...