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.
The first line contains two non-negative numbers n and m (0 ≤ n ≤ 3×105,0 ≤ m ≤ 3×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’.
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];
set 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;
}