[codeforces]514C

C. Watto and Mechanism
time limit per test:3 seconds
memory limit per test:256 megabytes

Watto, the owner of a spare parts store, has recently got an order for the mechanism that can process strings in a certain way. Initially the memory of the mechanism is filled with n strings. Then the mechanism should be able to process queries of the following type: “Given string s, determine if the memory of the mechanism contains string t that consists of the same number of characters as s and differs from s in exactly one position”.

Watto has already compiled the mechanism, all that’s left is to write a program for it and check it on the data consisting of n initial lines and m queries. He decided to entrust this job to you.

Input

The first line contains two non-negative numbers n and m (0n3×105,0m3×105) — the number of the initial strings and the number of queries, respectively.

Next follow n non-empty strings that are uploaded to the memory of the mechanism.

Next follow m non-empty strings that are the queries to the mechanism.

The total length of lines in the input doesn’t exceed 6×105 . Each line consists only of letters ‘a’, ‘b’, ‘c’.

Output

For each query print on a single line “YES” (without the quotes), if the memory of the mechanism contains the required string, otherwise print “NO” (without the quotes).

Input

2 3
aaaaa
acacaca
aabaa
ccacacc
caaac

Output

YES
NO
NO

题意:
先给你有n个字符串的词典,然后有m个询问,每次询问一个字符串B,看看词典中是否存在一个字符串A,使得这个字符串B跟字符串A等长并且有且只有一个位置上的字母不相同,存在则输出YES,不存在则输出NO。(输入的总字符数量不超过60W个)

题解:
字符串哈希,枚举有差异的位置,用set判断hash值的存在性,取MOD需要深思熟虑(假装深思熟虑,然后瞎取了一个跑得飞快hhhhhhhh,生日还是好用!!!)

#include
#define LiangJiaJun main
#define MOD 19991227007ll
#define ll long long
using namespace std;
int n,m;
char s[600004];
setmert;
int LiangJiaJun (){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        int l;ll HASH=0;
        scanf("%s",s+1);
        l=strlen(s+1);
        for(int j=1;j<=l;j++)HASH=(HASH*3+s[j]-'a')%MOD;
        mert.insert(HASH);
    }
    for(int i=1;i<=m;i++){
        int l;
        ll p=1,HASH=0,now;
        bool GT=0;
        scanf("%s",s+1);
        l=strlen(s+1);
        for(int j=1;j<=l;j++)HASH=(HASH*3+s[j]-'a')%MOD;
        GT=0;
        for(int j=l;j>=1;j--){
            for(int k=0;k<3;k++){
                if(k+'a' == s[j])continue;
                now=( HASH - ((s[j]-'a')*p)%MOD + (k*p)%MOD + MOD)%MOD;
                if(mert.count(now)){
                    puts("YES");
                    GT=1;break;
                }
            }
            if(GT)break;
            p=(p*3)%MOD;
        }
        if(!GT)puts("NO");
    }
    return 0;
}

你可能感兴趣的:(平衡树)