cdoj 1092 韩爷的梦

http://acm.uestc.edu.cn/#/problem/show/1092

题意:略

思路:

做的第一道字符串hash的题,真是菜啊,还是看了几篇题解才会做的。字符串hash感觉就是函数的选取和改变模数和基数使得冲突消失,这题嘛,就是wa了就换一组模数和基数。

实际上也不是很懂。就是算出每一个字符串的hash值,然后将其保存,最后sort一下,统计其中不同元素的个数。

p = 1e6 + 7;
mod = 1e9 + 9;
这对组合就过了,但是数组没有下标越界也很迷啊。
代码:
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 int a[200005];
 7 int mp[200];
 8 
 9 const int p = 1e6 + 7;
10 const int mod = 1e9 + 9;
11 
12 int myhash(char *s)
13 {
14     unsigned long long h = 0;
15 
16     for (;*s;s++)
17     {
18         h = (h * p + mp[(int)(*s)]) % mod;
19     }
20 
21     return h;
22 }
23 
24 int main()
25 {
26 
27     int cnt = 0;
28 
29     for (int i = 'a';i <= 'z';i++)
30     {
31         mp[i] = cnt++;
32     }
33 
34     for (int i = '0';i <= '9';i++)
35         mp[i] = cnt++;
36 
37     for (int i = 'A';i <= 'Z';i++)
38         mp[i] = cnt++;
39 
40     for (int i = 0;i < 20000;i++)
41     {
42         char s[105];
43 
44         scanf("%s",s);
45 
46         a[i] = myhash(s);
47     }
48 
49     sort(a,a+20000);
50 
51     int num = 0,su = -1;
52 
53     for (int i = 0;i < 20000;i++)
54     {
55         if (su != a[i])
56         {
57             su = a[i];
58             num++;
59         }
60     }
61 
62     printf("%d\n",num);
63 
64     return 0;
65 }

 

posted @ 2017-07-26 09:16  qrfkickit  阅读(203)  评论(0编辑  收藏  举报