2021.7.22提高B组模拟9T4 字符串匹配 (kmp)

Posted SSL_LKJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021.7.22提高B组模拟9T4 字符串匹配 (kmp)相关的知识,希望对你有一定的参考价值。

字符串匹配

题目大意

在这里插入图片描述

输入样例

加粗样式

2
usaco
cowusacousa

输出样例

在这里插入图片描述

3

题目数据

在这里插入图片描述

解题思路

T 串先复制一遍

然后做 kmp

最后答案求解

AC代码

#include<iostream>
#include<cstdio>
using namespace std;
int len1,len2,next[200005];
string A,B;
long long n,ans,tot;
void getnext()//预处理
{
	int k=-1;
	for(int i=1;i<len2;i++)
	{
		while(k>-1&&B[k+1]!=B[i])k=next[k];
		if(B[k+1]==B[i])k++;
		next[i]=k;
	}
}
void kmp()//kmp
{
	next[0]=-1;
	getnext();
	int k=-1;
	for(int i=0;i<len1;i++)
	{
		while(k>-1&&B[k+1]!=A[i])k=next[k];
		if(B[k+1]==A[i])k++;
		if(k==len2-1)
		{
			ans+=1ll*1;
			k=next[k];
			if(i<len1/2)tot++;
		}
	}
}
int main()
{
	scanf("%lld",&n);
	cin>>B;
	cin>>A;
	A+=A;
	len1=A.size();len2=B.size(); 
	kmp();
	printf("%lld\\n",ans+(ans-tot)*(n-2));//求答案
	return 0;
}


谢谢

以上是关于2021.7.22提高B组模拟9T4 字符串匹配 (kmp)的主要内容,如果未能解决你的问题,请参考以下文章

2021.7.12提高B组模拟1T4 Vani和Cl2捉迷藏(最大匹配)

2021.8.10提高B组模拟2T3 比赛(二分)(贪心—前缀和)

2021.7.19提高B组模拟7T3 只不过是长的领带(贪心)

2021.8.13提高B组模拟5T3 Word (暴力)

2021.8.9提高B组模拟1T1 最长公共回文子序列(dfs)

2021.8.13提高B组模拟5T3 Word (暴力)