/* ******************************************************************************** */
#include <iostream> //
#include <cstdio> //
#include <cmath> //
#include <cstdlib> //
#include <cstring> //
#include <vector> //
#include <ctime> //
#include <deque> //
#include <queue> //
#include <algorithm> //
#include <map> //
using namespace std; //
//
#define pb push_back //
#define mp make_pair //
#define X first //
#define Y second //
#define all(a) (a).begin(), (a).end() //
#define foreach(a, i) for (typeof(a.begin()) i = a.begin(); i != a.end(); ++ i) //
#define fill(a, x) memset(a, x, sizeof(a)) //
//
void RI(vector< int >&a, int n){a.resize(n); for ( int i=0;i<n;i++) scanf ( "%d" ,&a[i]);} //
void RI(){} void RI( int &X){ scanf ( "%d" ,&X);} template < typename ...R> //
void RI( int &f,R&...r){RI(f);RI(r...);} void RI( int *p, int *q){ int d=p<q?1:-1; //
while (p!=q){ scanf ( "%d" ,p);p+=d;}} void print(){cout<<endl;} template < typename T> //
void print( const T t){cout<<t<<endl;} template < typename F, typename ...R> //
void print( const F f, const R...r){cout<<f<< ", " ;print(r...);} template < typename T> //
void print(T*p, T*q){ int d=p<q?1:-1; while (p!=q){cout<<*p<< ", " ;p+=d;}cout<<endl;} //
//
typedef pair< int , int > pii; //
typedef long long ll; //
typedef unsigned long long ull; //
//
template < typename T> bool umax(T&a, const T&b){ return b>a? false :(a=b, true );} //
template < typename T> bool umin(T&a, const T&b){ return b<a? false :(a=b, true );} //
template < typename T> //
void V2A(T a[], const vector<T>&b){ for ( int i=0;i<b.size();i++)a[i]=b[i];} //
template < typename T> //
void A2V(vector<T>&a, const T b[]){ for ( int i=0;i<a.size();i++)a[i]=b[i];} //
//
/* -------------------------------------------------------------------------------- */
//
const int maxn = 1234567;
char s[maxn], a[123], c[123];
int lena, lenc, b, d, ta;
int buf[123], mark[123];
void init() {
char *ps = s;
for ( int i = 0; i < b; i ++) {
for ( int j = 0; j < lena; j ++) {
*ps ++ = a[j];
if (ps - s == ta || ps - s > 1111111) return ;
}
}
}
int work( int );
void solve( int &cc, int pp) {
if (pp == ta - 1) return ;
int rest = ta - pp - 1, cnt = rest / lena;
if (rest % lena) cnt ++;
ta = cnt * lena;
s[ta] = 0;
cc += work(pp % lena + 1);
}
int work( int start) {
memset (mark, 0, sizeof (mark));
memset (buf, 0, sizeof (buf));
int cc = 0, nowc = 0;
for ( int i = start; s[i]; i ++) {
if (s[i] == c[nowc]) nowc ++;
if (nowc == lenc) {
cc ++;
nowc = 0;
if (mark[i % lena]) {
cc += (ta - i - 1) / (i + 1 - mark[i % lena]) * (cc - buf[i % lena]);
int pp = i + (ta - i - 1) / (i + 1 - mark[i % lena]) *
(i + 1 - mark[i % lena]);
solve(cc, pp);
return cc;
}
else {
mark[i % lena] = i + 1;
buf[i % lena] = cc;
}
}
}
return cc;
}
int main() {
#ifndef ONLINE_JUDGE
freopen ( "in.txt" , "r" , stdin);
#endif // ONLINE_JUDGE
cin >> b >> d;
scanf ( "%s%s" , a, c);
lena = strlen (a);
lenc = strlen (c);
ta = lena * b;
init();
cout << work(0) / d << endl;
return 0; //
} //
//
//
//
/* ******************************************************************************** */
|