字符串哈希

知识点

哈希表

哈希表是一种可以以趋近于O(1)的时间服再度来判断元素是否存在的数据结构。
实现过程如下:将序列中的每个数对一个数(通常是一个质数,因为数学家已经证明,一堆数分别取余一个质数,同余的概率最小)取余,余数是几,就放在下标为几的位置上。判断是否存在时,将判断的数取余那个数,到对应下标去看就行了。
如1,13,27,10,59五个数,我们选择5来作模数。

下标/余数数字
010
11
227
313
459

如果将最后一个数改成58,与13取余5的值相同怎么办呢?
方法一:
把存数的位置都变成链表,将同余的数往链表上挂就行了,效果如下:

下标/余数数字
010
11
227
313 -> 58
4

方法二:
如果空间足够,就随便找个地方塞上,效果如下:

下标/余数数字
010
11
227
313
458

(我个人还是跟喜欢方法一的,因为方法二受数组空间的限制,而且速度慢,而方法一只是占用空间有点大)

字符串哈希

字符串的占用空间大,比较时间长,在某些时候十分难用,所以可不可以把字符串变成数字呢?
字符串哈希就是解决这个问题的算法。
第一步,将所有字符转成对应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;
}
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值