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;
}

作者 crxis

发表回复