Description
1<=n<=1012
The solution
不要被数据吓着了,其实只要复制后,在进行几次kmp就好了。
如果不明白就看code吧。
Code
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#define fo(i,a,b) for (int i=a;i<=b;i++)
#define fd(i,a,b) for (int i=a;i>=b;i--)
#define N 200005
using namespace std;
char s[N],t[N];
int p[N],lqy=0,tqy=0,j=1,len1,len2,nn;
long long ans=0,s1=0,s2=0,n;
void kmp()
{
j=0;
memset(p,0,sizeof(p));
fo(i,2,len1)
{
while (j && s[i]!=s[j+1]) j=p[j];
if (s[i]==s[j+1]) j++;
p[i]=j;
}
j=0;
fo(i,1,len2)
{
while (j && t[i]!=s[j+1]) j=p[j];
if (t[i]==s[j+1]) j++;
if (j==len1) ans++,j=p[j];
}
j=0;
fo(i,len2-len1+2,len2+len1-1)
{
while (j && t[i]!=s[j+1]) j=p[j];
if (t[i]==s[j+1]) j++;
if (j==len1)
{
j=p[j];
if (n-1) s1++;
}
}
}
int main()
{
//freopen("data.in","r",stdin);
scanf("%lld",&n);scanf("%s",s+1);scanf("%s",t+1);
len1=strlen(s+1),len2=strlen(t+1);
if (j>n) {printf("0\n");return 0;}
n/=j;
len2*=j;
fo(i,len2+1,2*len2) t[i]=t[i-len2];
kmp();
printf("%lld\n",ans*n+s1*(n-1));
}