题意:
输入n个字符串,然后进行m次询问,每次询问输入一个字符串,问n个字符串中是否存在与当前输入的字符串长度相等,并且刚好有且仅有一个位置的字符不同。存在则输出YES,不存在输出NO。
参考http://blog.csdn.net/u011580493/article/details/43852341
分析:
感觉好坑啊。。
感觉不会hash
- 为什么用ULL会错;
- 为什么是×TS【len-i-1】?
#define ULL long long
#define LL long long
#define inf 0x3f3f3f3f
const ULL mod=1e9+7;
const ULL seed=257;
ULL haha[N+2],TS[N+2];
char s[N];
set<ULL>has;
void init(){
TS[0]=1;
for(int i=1;i<N;++i){ TS[i]=(TS[i-1]*seed)%mod; }
}
int gethash(char *s){
int len=strlen(s);
ULL tmp=0;
for(int i=0;i<len;++i){
tmp=(tmp*seed+s[i])%mod;
}
return tmp;
}
bool judge(char *s){
int len=strlen(s);
ULL sans=gethash(s);
for(int i=0;i<len;++i){
for(char t='a';t<='c';++t){
if(t==s[i])continue;
ULL now=(((t-s[i])*TS[len-i-1]+sans)%mod+mod)%mod;
if(has.find(now)!=has.end())return true;
}
}
return false;
}
int main(){
init();
int n,m;
sf("%d%d",&n,&m);
rep(i,1,n){
sf("%s",s);
ULL sans=gethash(s);
has.insert(sans);
}
rep(i,1,m){
sf("%s",s) ;
if(judge(s))puts("YES");
else puts("NO");
}
}