Description
Solution
很显然的KMP嘛,
把T串加长,然后把n求个余数然后除一下,再倍长后做几遍KMP即可,
复杂度:
O(n)
Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long LL;
const int N=100500;
int n,m,n1;
LL m1,ans,s1,s2;
char a[N*2],b[N];
int nx[N*2];
int main()
{
int q;
scanf("%lld\n",&m1);
scanf("%s",b+1);m=strlen(b+1);
scanf("%s",a+1);n=strlen(a+1);
q=1;
while(q*n<m)
{
fo(i,q*n+1,q*n+n)a[i]=a[i-q*n];
q++;
}
if(q>m1){printf("0\n");return 0;}
n1=m1%q*n;
m1/=q;
n*=q;
fo(i,n+1,2*n)a[i]=a[i-n];
q=0;
fo(i,2,m)
{
while(q&&b[i]!=b[q+1])q=nx[q];
if(b[i]==b[q+1])++q;
nx[i]=q;
}
ans=s1=s2=0;
q=0;
fo(i,1,n)
{
while(q&&a[i]!=b[q+1])q=nx[q];
if(a[i]==b[q+1])++q;
if(q==m)ans++,q=nx[q];
}
q=0;
fo(i,n-m+2,n+m-1)
{
while(q&&a[i]!=b[q+1])q=nx[q];
if(a[i]==b[q+1])++q;
if(q==m)
{
q=nx[q];
if(m1-1)s1++;
if(i-n<=n1)s2++;
}
}
printf("%lld\n",ans*m1+s1*(m1-1+(n1!=0))+s2);
return 0;
}