2021.07.22【NOIP提高B组】模拟 字符串匹配

7 篇文章 0 订阅
这篇博客主要探讨了如何运用KMP算法解决大规模字符串匹配的问题。代码实现中,首先计算了部分匹配表next,然后通过循环扩展目标字符串来处理超长匹配。在计算过程中,分别计算了完整周期内的匹配次数、周期外的匹配次数以及剩余部分的匹配次数。最后,将这些计数相加得到了总的匹配次数。
摘要由CSDN通过智能技术生成

在这里插入图片描述

思路:

这题直接暴力KMP

c o d e code code

#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;

string s, t;
long long n;
long long next[1010000];

int main()
{
	scanf("%lld", &n);
	n--;
	cin>>s>>t;
	string ss;
	ss=t;
	long long m=1;
	while(t.size()<s.size()&&n>0)
	{
		t=t+ss;
		n--;
		m++;
	}
	long long ys=n%m;
	long long cs=n/m;
	if(t.size()<s.size()&&n<=0)
	{
		printf("0");
		return 0;
	}
	next[0]=-1;
	long long k=-1;
	for(long long i=1; i<s.size(); i++)
	{
		while(s[k+1]!=s[i]&&k!=-1)
			k=next[k];
		if(s[k+1]==s[i])
			k++;
		next[i]=k;
	}
	k=-1;
	long long ts=0;
	for(long long i=0; i<t.size(); i++)
	{
		while(s[k+1]!=t[i]&&k!=-1)
			k=next[k];
		if(s[k+1]==t[i])
			k++;
		if(k==s.size()-1)
		{
			ts++;
			k=next[k];
		}
	}
	string st;
	st=t+t;
	long long fzts=0;
	if(cs)
	{
		k=-1;
		for(long long i=t.size()-s.size()+1; i<t.size()+s.size()-1; i++)
		{
			while(s[k+1]!=st[i]&&k!=-1)
				k=next[k];
			if(s[k+1]==st[i])
				k++;
			if(k==s.size()-1)
			{
				fzts++;
				k=next[k];
			}
		}
	}
	long long syts=0;
	if(ys)
	{
		string sst;
		sst=t;
		while(ys!=0)
			sst=sst+ss, ys--;
		k=-1;
		for(long long i=t.size()-s.size()+1; i<sst.size(); i++)
		{
			while(s[k+1]!=sst[i]&&k!=-1)
			k=next[k];
			if(s[k+1]==sst[i])
				k++;
			if(k==s.size()-1)
			{
				syts++;
				k=next[k];
			}
		}
	}
	printf("%lld", ts*(cs+1)+cs*fzts+syts);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值