[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 ( 0   ≤   n   ≤   3 × 1 0 5 , 0   ≤   m   ≤   3 × 1 0 5 ) (0 ≤ n ≤ 3×10^5, 0 ≤ m ≤ 3×10^5) (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 × 1 0 5 6×10^5 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<bits/stdc++.h>
#define MOD 19991227007ll
#define ll long long
using namespace std;
int n,m;
char s[600004];
set<ll>mert;
int main (){
    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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值