题意:
给出一个包含n个单词的字典,给出m个待查询单词,如果单词在有且仅有一个字符不相同的情况下可以在字典里找到,则输出YES,否则输出NO
http://codeforces.com/problemset/problem/514/C
0 <= n,m <= 3*10^5; 总字符长度不大于6*10^5
思路 哈希
#include <cstdio>
#include <numeric>
#include <iostream>
#include <vector>
#include <set>
#include <cstring>
#include <string>
#include <map>
#include <cmath>
#include <ctime>
#include <algorithm>
#include <bitset>
#include <queue>
#include <sstream>
#include <deque>
using namespace std;
typedef pair<int,int> PR;
string s;
int n,m;
long long p[600007];
long long hs;
set<long long> st[600007];
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
//freopen("in.txt","r",stdin);
cin>>n>>m;
p[0]=1;
for(int i=1; i<=600000; i++) p[i]=(p[i-1]*239017)%100000000009;
for(int i=0; i<n; i++)
{
cin>>s;
int len=s.size();
hs=0;
for(int j=0; j<len; j++)
{
(hs+=s[j]*p[j])%=1000000009;
}
for(int j=0; j<len; j++)
{
for(int k=0; k<3; k++)
{
if(s[j]-'a'!=k)
{
//cout<<"jaja"<<" "<<((hs-s[j]*p[j]+(k+'a')*p[j])%1000000009+1000000009)%1000000009<<endl;
st[len].insert(((hs-s[j]*p[j]+(k+'a')*p[j])%1000000009+1000000009)%1000000009);
}
}
}
}
for(int i=0; i<m; i++)
{
cin>>s;
int len=s.size();
hs=0;
for(int j=0; j<len; j++)
{
(hs+=s[j]*p[j])%=1000000009;
}
//cout<<"jaja22222"<<" "<<hs<<endl;
if(st[len].find(hs)!=st[len].end()) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}