思路:
这题直接暴力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;
}