知识点
哈希表
哈希表是一种可以以趋近于O(1)的时间服再度来判断元素是否存在的数据结构。
实现过程如下:将序列中的每个数对一个数(通常是一个质数,因为数学家已经证明,一堆数分别取余一个质数,同余的概率最小)取余,余数是几,就放在下标为几的位置上。判断是否存在时,将判断的数取余那个数,到对应下标去看就行了。
如1,13,27,10,59五个数,我们选择5来作模数。
下标/余数 | 数字 |
---|---|
0 | 10 |
1 | 1 |
2 | 27 |
3 | 13 |
4 | 59 |
如果将最后一个数改成58,与13取余5的值相同怎么办呢?
方法一:
把存数的位置都变成链表,将同余的数往链表上挂就行了,效果如下:
下标/余数 | 数字 |
---|---|
0 | 10 |
1 | 1 |
2 | 27 |
3 | 13 -> 58 |
4 |
方法二:
如果空间足够,就随便找个地方塞上,效果如下:
下标/余数 | 数字 |
---|---|
0 | 10 |
1 | 1 |
2 | 27 |
3 | 13 |
4 | 58 |
(我个人还是跟喜欢方法一的,因为方法二受数组空间的限制,而且速度慢,而方法一只是占用空间有点大)
字符串哈希
字符串的占用空间大,比较时间长,在某些时候十分难用,所以可不可以把字符串变成数字呢?
字符串哈希就是解决这个问题的算法。
第一步,将所有字符转成对应ASCLL码值,变成一个128进制的数。
第二步,将128进制数通过位值原理来转换成十进制数。
这样得到的数就是字符串的哈希值了
例题
题目:求哈希值
时间限制:1秒 内存限制:128M
题目描述
输入一个字符串,请输出其哈希值对998244353取余的结果。
输入样例1
apple
输出样例1
320616011
输入样例2
nihao!chilema?
输出样例2
979475980
数据范围
字符串长度不超过100000
求哈希值题解
思路
板子题,通过字符串哈希求解。
(温馨提示:pow肯定会爆,需手写求幂次函数中间进行取余)
代码
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int a[10],mod=998244353;
long long fast_pow(long long a,long long b){
long long fac=1;
while(b>0){
if(b&1){
fac*=a;
fac%=mod;
}
a=a*a;
a%=mod;
b>>=1;
}
return fac%mod;
}
int main(){
long long ans=0;
string s;
getline(cin,s);
for(int i=0;i<s.size();i++){
ans+=fast_pow(128,(s.size()-i-1))*s[i];
ans%=mod;
}
cout<<ans;
return 0;
}