什么是字符串hash?
哈希过程其实可以看做对一个串的单向加密过程,并且需要保证所加的密不能高概率重复;
如通过哈希数组来判断几个串是否相同(洛谷P3370)
可以通过一个固定的转换方式,将相同的串使其的“密”一定相同,不同的串 尽量 不同;
先对比字符串长度然后对比ascll码之和
显然不行
ab和ba是两个不同的串,但ASCLL码之和相同,这个就是HASH冲突
但单向加密哈希中,hash冲突难以避免
进制哈希
核心:给出一个固定机制的base,将一个串的每一个元素看作一个进制上的数字,所以这个串就可以看作一个base进制的数,那么这个就是这个串的哈希值;则我们通过比对每个串的哈希值,即可判断两个串是否相同
而哈希其实就是把一个数转化为一个值,这个值是base进制的,储存在哈希表中,注意一下在存入的时候取模一下即可
什么是哈希?
hash就是像一个函数一样的东西,放入一个值,它给你输出一个值,输出的值就是hash值,一般hash值会比原来的值更好存储或比较
字符串哈希
//自然溢出
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef unsigned long long ull;//0-2^64防止爆栈搞出负数,ull是无符号的,模数
ull base=131;//base 应选择不小于字符集数的质数
ull a[10010];
char s[10010];
int n, ans=1;
int prime=233317;
ull mod=212370440130137957ll;//在允许范围内的最大质数
ull hash(char s[]){
int len=strlen(s);
ull ans=0;
for(int i=0;i<len;i++){
ans=(ans*base+(ull)s[i])%mod+prime;
}
return ans;
}
int main(){
cin >>n;
for (int i=1;i<=n;i++){
cin>>s;
a[i]=hash(s);
}
sort (a+1,a+n+1);
for(int i=1;i<n;i++){
if( a[i]!=a[i+1]{
ans++;
}
}
cout<<ans;
return 0;
}