字符串哈希
题目: 常用来判断是否是其字串,或该字串出现次数
字串查找
题面:
给定一个字符串 A 和一个字符串 B,求 B 在 A 中的出现次数。A 和 B 中的字符均为英语大写字母或小写字母。
A 中不同位置出现的 B 可重叠。
样例
输入
zyzyzyz
zyz
输出
3
知识介绍
字符串哈希 :
将字符串变成P进制数,将字符映射成数字
P 一般选定为质数(131 或 1331)
采用字符的ASCII码乘上P的次方
例如
ABCABCD
h[0] = 0 ,h[1] = "A"的哈希值,h[2] = "AB"的哈希值 ,h[3] = "ABC" 的哈希值
映射公式: x1 * p 0 + x2 * p 1 + x3 * p 2 + ····· + xn * p n-1
统计前缀和 & 记录部分和
区间字符串转化为数字关系
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int P = 131;
const int N = 1e6 + 50;
long long h[N],p[N];
long long sum,k;
char a[N],b[N];
int main()
{
scanf("%s%s",a+1,b+1);//从a[1] 开始
int lena = strlen(a + 1);
int lenb = strlen(b + 1);
p[0] = 1;
for(int i = 1; i <= lenb ; i++)
{
k = k * P + (long long)(b[i]);
p[i] = p[i - 1] * P;
}
for(int i = 1; i <= lena; i++)
h[i] = h[i - 1] * P + (long long)(a[i]);
for(int i = lenb;i <= lena;i ++)
{
if(h[i] - h[i - lenb] * p[lenb] == k)
sum++;
}
printf("%lld",sum);
return 0;
}

浙公网安备 33010602011771号