字符串哈希是将一个字符串对应一个整数,且只有相同的字符串对应的整数相同。这样我们在判断两个字符串是否相同时就可以比较它们所对应的整数是否相同就可以了。
首先是哈希算法的公式:
定义一个整数数组hash,和一个字符数组a,
a数组前i位所组成的字符串所对应的整数为
hash[i]=hash[i−1]∗p+a[i]-‘a’+1
a数组从l到r所组成的字符串对应的整数为
*hash[r-l]=hash[r]-hash[l]+(r-l+1)p^(r-l+1),
其中p是质数。
哈希算法有两种
一种是自然溢出法:将哈希数组用unsigned long long int定义,当数据溢出时会自动mod2的64次方减1。可以直接用上面的哈希算法的公式。
另一种是单哈希法:与自然溢出法比,单哈希法的公式多了一个取模。如下
hash[i]=(hash[i−1]∗p+a[i]-‘a’+1)% mod
其中mod是质数,并且mod>p
例题链接https://www.acwing.com/problem/content/description/140/
代码如下
#include<stdio.h>
#include<string.h>
#define P 131
char a[1001000];
unsigned long long int hash