UVA12338 Anti-Rhyme Pairs
UVA12338 Anti-Rhyme Pairs
题意
T组数据,每次给N个字符串,Q次询问,问第i个和第j个字符串的最长公共前缀
题解
哈希+二分,vector存Hash值
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int base=131;
const ll mod=1e9+10;
const int N=1e5+10;
int T,n,t;
char s[N];
int len[N];
vector<ll> Hash[N];
ll sum[N];
int ans;
void solve(int x,int y){
int l=0,r=min(len[x],len[y]);
ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(Hash[x][mid]==Hash[y][mid]){
ans=mid;
l=mid+1;
}else r=mid-1;
}
}
int main(){
scanf("%d",&T);
for(int i=1;i<=100000;i++) sum[i]=(sum[i-1]*base)%mod;
for(int Case=1;Case<=T;Case++){
printf("Case %d:\n",Case);
for(int i=1;i<=100000;i++) Hash[i].clear();
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",s+1);
len[i]=strlen(s+1);
Hash[i].push_back(0);
for(int j=1;j<=len[i];j++){
Hash[i].push_back((Hash[i][j-1]*base%mod+s[j])%mod);
}
}
scanf("%d",&t);
for(int i=1;i<=t;i++){
int x,y;
scanf("%d%d",&x,&y);
solve(x,y);
printf("%d\n",ans);
}
}
return 0;
}

浙公网安备 33010602011771号