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 ",num); 63 64 return 0; 65 }