字串查詢(字串雜湊)

star_yongheng發表於2020-11-10

這是一道模板題。

給定一個字串 A 和一個字串 B ,求 B在 A 中的出現次數。 A和 B中的字元均為英語大寫字母或小寫字母。

A中不同位置出現的 B可重疊。
輸入格式
輸入共兩行,分別是字串 A和字串 B。

輸出格式
輸出一個整數,表示 B在 A中的出現次數。

樣例輸入

zyzyzyz
zyz

樣例輸出

3

資料範圍與提示
1<= A,B的長度<=10^6 ,A、 B僅包含大小寫字母。

字串雜湊模板提

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define K 131 
#define ULL unsigned long long
int N;
char s1[1000010], s2[1000010];
ULL a[1000010],f[1000010],l1,l2,t;
ULL find(int x,int y) //計算下標 x到 y的子串的雜湊值 
{
	return f[y]-f[x-1]*a[y-x+1];
}
int main()
{
	int i,j;
	a[0]=1;
	for(i=1; i<=1000000; ++i)   //先遍歷出 a^n
		a[i]=a[i-1]*K;
	int sum=0;
	t=0;
	scanf("%s%s",s1+1,s2+1);   //從下標 1開始存  
	l1=strlen(s1+1);
	l2=strlen(s2+1);
	for(j=1; j<=l1; j++) 
	f[j]=f[j-1]*K+(s1[j]-'A'+1);   //計算主串的滾動雜湊值
	for(j=1; j<=l2; j++)
	t=t*K+(s2[j]-'A'+1);   //計算匹配串的雜湊值
	for(j=1;j+l2-1<=l1; ++j)
	{
		if(find(j,j+l2-1)==t)  //判斷兩串是否相同 
			sum++;
	}
	printf("%d\n",sum);
	return 0;
}

相關文章