题目大意:
给你n个单词,问你任意两个单词的相似度是多少。(相似度就是两个单词从第一个单词开始一共有多少个字母是相同的)
解决方法:
字符串hash
我的代码:
#include <cstdio>
#include <string>
#include <iostream>
#include <cstring>
#include <algorithm>
#define seed 31
#define maxn 1000010
#define ull unsigned long long
using namespace std;
char s[maxn];
int n,m,len[maxn],sta[maxn];
ull ub[maxn];
int cal(int x,int y){
if (x==y) return len[x];
else {
int l=0,r=min(len[x],len[y]);
while (l<r){
int m=(l+r+1)/2;
if (ub[sta[x]+m-1]==ub[sta[y]+m-1]) l=m;
else r=m-1;
}
return l;
}
return 0;
}
int main (){
//freopen("test.in","r",stdin);
int T,t=1;scanf("%d",&T);
while (T--){
printf("Case %d:\n",t++);
scanf("%d",&n);
int pos=0;
for (int i=0;i<n;i++){
scanf("%s",s+pos);
ub[pos]=s[pos];
sta[i]=pos;
len[i]=strlen(s+pos);
for (int j=pos+1;j<pos+len[i];j++)
ub[j]=ub[j-1]*seed+s[j];
pos+=len[i];
}
scanf("%d",&m);
for (int i=0;i<m;i++){
int a,b;scanf("%d%d",&a,&b);
printf("%d\n",cal(a-1,b-1));
}
}
return 0;
}