AtCoder数据比较强,单哈希会被卡2个点,指定长度被卡1个点,双哈希指定长度才通过了。怕被卡还是用字典树比较稳。
#include <bits/stdc++.h>
const long long N=500029, E=149, M=2004577;
using namespace std;
int n, m, i, j, k, c[N];
char s[N], u;
string a[N];
long long v, t;
map <long long, long long> f;
int main(){
scanf("%d", &n);
for(i=1; i<=n; i++){
scanf("%s", s);
a[i] = s, c[i] = strlen(s);
for(j=v=t=0; s[j]; j++){
v = (v*E+a[i][j]) % M;
t = (t*E+a[i][j]-96) % N;
v = (v*N + t) * N + j;
f[v]++;//同种长度哈希值出现次数
}
}//三哈希:N、M、长度
for(i=1; i<=n; i++){
for(j=v=t=0; j<c[i]; j++){
v = (v*E+a[i][j]) % M;
t = (t*E+a[i][j]-96) % N;
v = (v*N + t) * N + j;
if(f[v] == 1) break;
}//第j个开始,只有自己一个前缀了
printf("%d\n", j);
}
return 0;
}