Fork me on GitHub

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;
} 
posted @ 2020-03-17 14:27  qjy_73  阅读(82)  评论(0)    收藏  举报