什么是字符串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;}