# Codeforces Round #422 (Div. 2), problem: (E) Liar Solution In C/C++

#include<bits/stdc++.h>
typedef long long ll;
const int N=100010;
const ll mo=1000000007;
int n,x,i,l,r,m,mid,g[N][35],j,k;
ll hs[N],ht[N],q[N];
char s[N],t[N];
inline ll hashs(int l,int r){
return (hs[r]-hs[l-1]*q[r-l+1]%mo+mo)%mo;
}
inline ll hasht(int l,int r){
return (ht[r]-ht[l-1]*q[r-l+1]%mo+mo)%mo;
}
inline int lcp(int i,int j){
if(s[i]!=t[j])return 0;
l=1;
if(m-j<n-i)r=m-j+1;
else r=n-i+1;
while(l<r){
mid=(l+r+1)>>1;
if(hashs(i,i+mid-1)==hasht(j,j+mid-1))l=mid;
else r=mid-1;
}
return l;
}
inline void up(int&a,int b){
if(a<b)a=b;
}
int main(){
scanf(“%d%s%d%s%d”,&n,s+1,&m,t+1,&x);
q[0]=1;
for(i=1;i<=n;++i){
q[i]=q[i-1]*31%mo;
hs[i]=(hs[i-1]*31+s[i]-‘a’)%mo;
ht[i]=(ht[i-1]*31+t[i]-‘a’)%mo;
}
i=lcp(1,1);
g[lcp(1,1)][1]=i;
for(i=0;i<n;++i)
for(j=0;j<=x;++j){
up(g[i+1][j],g[i][j]);
if(g[i][j]<m)k=lcp(i+1,g[i][j]+1),up(g[i+k][j+1],g[i][j]+k);
//else return puts(“YES”),0;
}
for(i=0;i<=x;++i)if(g[n][i]==m)return puts(“YES”),0;
return puts(“NO”),0;
}

(Visited 30 times, 1 visits today)