[codeforces]514C

来源:互联网 发布:初级linux运维面试题 编辑:程序博客网 时间:2024/04/28 21:57

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 3aaaaaacacacaaabaaccacacccaaac

Output

YESNONO

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

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

#include<bits/stdc++.h>#define LiangJiaJun main#define MOD 19991227007ll#define ll long longusing namespace std;int n,m;char s[600004];set<ll>mert;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;}
原创粉丝点击