复制代码

字符串哈希

题目: 常用来判断是否是其字串,或该字串出现次数
字串查找

题面:

给定一个字符串 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;
}
 
posted @ 2023-09-18 16:12  Elgina  阅读(34)  评论(0)    收藏  举报