其他分享
首页 > 其他分享> > 【gmoj】 【kmp】 字符串匹配

【gmoj】 【kmp】 字符串匹配

作者:互联网

【gmoj】 【kmp】 字符串匹配

题目

在这里插入图片描述


解题思路

关于忘了kmp怎么打这件事 qwq

将Y串复制n遍和X串匹配
X作为Y的子串 会出现在两种地方 Y串以内 或 两个Y串之间
这种题非kmp莫属啦
求一遍Y串内有多少个子串X
再将两串接在一起求一次
取Y队尾的|X|-1个,对头的|X|-1个,多拿了可能包括了原先在Y串内的子串


代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long n,l,ans,da,lenx,leny,lens;
int net[200010],next[100010];
char x[100010],y[100010],s[200010];
int main()
{
	scanf("%lld",&n);
	scanf("%s%s",x+1,y+1);
	lenx=strlen(x+1);
	leny=strlen(y+1);
	l=0;
	for (int i=2;i<=lenx;i++)
	{ 
		while (l!=0&&x[i]!=x[l+1]) l=next[l];
		if (x[i]==x[l+1]) l++;
		next[i]=l; 
	}
	l=0;
	for (int i=1;i<=leny;i++)
	{  
		while (l!=0&&x[l+1]!=y[i]) l=next[l];
		if (x[l+1]==y[i]) l++;
		if (l==lenx) ans++; 
	}
	lens=lenx*2-2;
	for (int i=lenx-1;i>0;i--)
	    s[lenx-i]=y[leny-i+1];
	for (int i=1;i<lenx;i++)
	    s[lenx+i-1]=y[i];
	l=0;
	for (int i=1;i<=lens;i++)
	{
		while (s[i]!=x[l+1]&&l!=0) l=next[l];
		if (s[i]==x[l+1]) l++;
		if (l==lenx) da++;  
	}
	printf("%lld",ans*n+da*(n-1));
	return 0;
}

标签:lenx,int,ans,next,++,kmp,字符串,gmoj
来源: https://blog.csdn.net/qq_45621109/article/details/119001882