赞
踩
Analyse:
我也是才学字符串哈希,大概理解是,对于一个字符串,你可以通过某种方式,来将整个字符串转化为一个数值,然后就用这个数值来代表了这个字符串。但是这种计算方式是有一定要求的, 也就是说 在需要计算的字符串很多的情况下,要不同的字符串计算出来的这个数值尽可能的不同,这样才能保证一一对应。。。。都不知道自己在说什么,Orz
AC代码:
- ///单哈希
- #include<bits/stdc++.h>
- using namespace std;
-
- const int maxn = 1e4 + 10;
- typedef long long ll;
- typedef unsigned long long ull;
-
- ull harsh[maxn]; ///ull 是自动取模,对2^63
- char ch[maxn];
-
- ull gethash(char *s){
- ull h = 0;
- int len = strlen(s);
- for(int i = 0;i < len;i ++){
- h = h * 13331 + s[i] - '0'; ///这也就是那个 特殊的计算方式
- }
- return h;
- }
-
- int main()
- {
- int n; scanf("%d",&n);
- for(int i = 0;i < n;i ++){
- scanf("%s",ch);
- harsh[i] = gethash(ch);
- }
- sort(harsh,harsh + n);
- int m = unique(harsh,harsh + n) - harsh;
- printf("%d\n",m);
- return 0;
- }
还有的方法就是多一个计算方式,让两个数值来代表同一个 字符串,这样也就能更加减少 重复的可能。
- #include<bits/stdc++.h>
- using namespace std;
-
- const int maxn = 1e4 + 10;
- typedef long long ll;
- typedef unsigned long long ull;
-
- struct xx{
- ull a,b; ///ull 是自动取模,对2^63;
- }harsh[maxn];
-
- char ch[maxn];
-
- void gethash(char *s,int num){
- ull h = 0,h1 = 0;
- int len = strlen(s);
- for(int i = 0;i < len;i ++){
- h = h * 13331 + s[i] - '0'; ///这也就是那个 特殊的计算方式
- h1 = h * 9991 + (int) s[i];
- }
- harsh[num].a = h;
- harsh[num].b = h1;
- }
-
- bool cmp(xx A,xx B){
- if(A.a != B.a)
- return A.a < B.a;
- return A.b < B.b;
- }
-
- int main()
- {
- int n; scanf("%d",&n);
- for(int i = 0;i < n;i ++){
- scanf("%s",ch);
- gethash(ch,i);
- }
- int ans = 0;
- sort(harsh,harsh + n,cmp);
- for(int i = 0;i < n;i ++)
- if(harsh[i].a == harsh[i + 1].a && harsh[i].b == harsh[i + 1].b)
- ans ++;
- printf("%d\n",n - ans);
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。