KMP && 字符串hash模板

博客介绍了如何使用KMP算法统计字符串sr在字符串st中的出现次数,并提供了字符串哈希的模板代码,注释详细。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意

统计字符串sr在字符串st中出现次数

代码

被注释的是字符串hash模板

#include<cstdio>
#include<cstring>
#include<algorithm>
#define fr(i,a,b) for(i=a;i<=b;i++)
#define maxn 10000006
using namespace std;
typedef long long ll;
const ll ding=998244353;

int T,i,j,k,lt,lr,cod,ans,p[maxn];
//ll h2,h[maxn],pr[maxn];
char st[maxn],sr[maxn];
/*ll get(int x,int L)
{
	return (h[x+L-1]-h[x-1]*pr[L]%ding+ding)%ding;
}
void pre()
{
	int i;
	pr[0]=1;
	fr(i,1,lt)
	{
		pr[i]=pr[i-1]*29%ding;
		h[i]=(h[i-1]*29%ding+st[i]-'a')%ding;
	}
	return;
}
void pre2()
{
	int i;
	fr(i,1,lr) h2=(h2*29%ding+sr[i]-'a')%ding;
}*/
int main()
{
	freopen("data.in","r",stdin);
	scanf("%d",&T);
	while (T--)
	{
		// memset(p,0,sizeof(p));
		
		scanf("%s",sr+1);
		scanf("%s",st+1);
		
		lt=strlen(st+1);
		lr=strlen(sr+1);
		// pre();
		// pre2();
		ans=j=p[1]=0;
		fr(i,2,lr)
		{
			while (j && sr[i]!=sr[j+1]) j=p[j];
			if (st[i]==st[j+1]) ++j;
			p[i]=j;
		}
		
		j=0;
		fr(i,1,lt)
		{
			while (j && st[i]!=sr[j+1]) j=p[j];
			if (st[i]==sr[j+1]) ++j;
			if (j==lr)
				j=0,++ans;
		}
		/*i=1;
		while (i<=lt-lr+1)
			if (get(i,i+lr-1)==h2) 
				++ans,i+=lr;
		*/
		printf("%d\n",ans);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值