【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;
}