hash+set Codeforces Round #291 (Div. 2) C. Watto and Mechanism

 

题目传送门

复制代码
 1 /*
 2     hash+set:首先把各个字符串的哈希值保存在set容器里,然后对于查询的每一个字符串的每一位进行枚举
 3         用set的find函数查找是否存在替换后的字符串,理解后并不难。另外,我想用64位的自然溢出wa了,不清楚
 4 */
 5 /************************************************
 6 * Author        :Running_Time
 7 * Created Time  :2015-8-5 13:05:49
 8 * File Name     :D.cpp
 9  ************************************************/
10 
11 #include <cstdio>
12 #include <algorithm>
13 #include <iostream>
14 #include <sstream>
15 #include <cstring>
16 #include <cmath>
17 #include <string>
18 #include <vector>
19 #include <queue>
20 #include <deque>
21 #include <stack>
22 #include <list>
23 #include <map>
24 #include <set>
25 #include <bitset>
26 #include <cstdlib>
27 #include <ctime>
28 using namespace std;
29 
30 #define lson l, mid, rt << 1
31 #define rson mid + 1, r, rt << 1 | 1
32 typedef long long ll;
33 const int MAXN = 6e5 + 10;
34 const int INF = 0x3f3f3f3f;
35 const int MOD = 1e9 + 7;
36 const int KEY = 257;
37 char s[MAXN];
38 set<ll> S;
39 ll ha[MAXN];
40 int n, m;
41 
42 void init(void) {
43     ha[0] = 1;
44     for (int i=1; i<MAXN; ++i)  ha[i] = ha[i-1] * KEY % MOD;
45 }
46 
47 ll get_hash(char *s)    {
48     int len = strlen (s);
49     ll res = 0;
50     for (int i=0; i<len; ++i)  {
51         res = (res * KEY + s[i]) % MOD;
52     }
53     return res;
54 }
55 
56 bool judge(char *s) {
57     int len = strlen (s);
58     ll h = get_hash (s);
59     for (int i=0; i<len; ++i)   {
60         for (ll ch='a'; ch<='c'; ++ch)    {
61             if (ch == s[i])   continue;
62             if (S.find ((((ch-s[i]) * ha[len-i-1] + h) % MOD + MOD) % MOD) != S.end ())    return true;
63         }
64     }
65     return false;
66 }
67 
68 int main(void)    {     //Codeforces Round #291 (Div. 2) C. Watto and Mechanism
69     init ();
70     while (scanf ("%d%d", &n, &m) == 2) {
71         S.clear ();
72         for (int i=1; i<=n; ++i)    {
73             scanf ("%s", s);
74             S.insert (get_hash (s));
75         }
76         for (int i=1; i<=m; ++i)    {
77             scanf ("%s", s);
78             if (judge (s))  puts ("YES");
79             else    puts ("NO");
80         }
81     }
82 
83     return 0;
84 }
复制代码

 

posted @   Running_Time  阅读(234)  评论(0编辑  收藏  举报
编辑推荐:
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
阅读排行:
· 对象命名为何需要避免'-er'和'-or'后缀
· JDK 24 发布,新特性解读!
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· SQL Server如何跟踪自动统计信息更新?
点击右上角即可分享
微信分享提示