码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-05 17:53:01      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

 

题目传送门

 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 }

 

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

标签:

原文地址:http://www.cnblogs.com/Running-Time/p/4705101.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!