【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;
}
上一篇:7.15复习笔记


下一篇:kmp 算法