#include #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") using namespace std; using ll = long long; const ll mod = 998244353; #define fi first #define se second #define rep(i,n) for(ll i=0;i>=1; } return res; } ll modinv(ll A){return modpow(A,mod-2);} void NTT(vector &A,const bool rev=false){ vector B(A.size(),0); ll R=mod-1-(mod-1)/((ll)A.size()); if(rev) R=(mod-1)/((ll)A.size()); ll s=modpow(root,R); vector power((ll)A.size()/2+1,1); rep(i,(ll)A.size()/2) power[i+1]=(power[i]*s)%mod; ll cur=(ll)A.size()/2; for(ll i=1;i<(ll)A.size();i*=2){ rep(j,cur){ rep(k,i){ ll p=A[k+i*j]; ll q=A[k+i*j+(ll)A.size()/2]; B[k+2*i*j]=(p+q)%mod; B[k+2*i*j+i]=(p+mod-q)*power[i*j]%mod; } } swap(A,B); cur/=2; } if(rev){ s=modinv((ll)A.size()); rep(i,(ll)A.size()) A[i]=(A[i]*s)%mod; } } vector convolution(vector A,vector B){ ll size_=1; while(size_<=(ll)A.size()+(ll)B.size()-1) size_*=2; while(A.size()> N >> M >> K; string s,t; cin >> s >> t; vector po(500500,1); rep(i,500500-1) po[i+1]=po[i]*100%mod; vector S(N),T(M); vector A0(N),A1(N); vector B0(M),B1(M); rep(i,N){ if('a'<=s[i]&&s[i]<='z') S[i]=(s[i]-'a')+1,A0[i]=0; if('A'<=s[i]&&s[i]<='Z') S[i]=(s[i]-'A')+1,A0[i]=1; S[i]=S[i]*po[i]%mod; A1[i]=1-A0[i]; } rep(i,M){ if('a'<=t[i]&&t[i]<='z') T[i]=(t[i]-'a')+1,B0[i]=0; if('A'<=t[i]&&t[i]<='Z') T[i]=(t[i]-'A')+1,B0[i]=1; T[i]=T[i]*po[i]%mod; B1[i]=1-B0[i]; } reverse(all(B0)); reverse(all(B1)); vector C0=convolution(A0,B1); vector C1=convolution(A1,B0); vector cumS(N+1,0),cumT(M+1,0); rep(i,N) cumS[i+1]=(cumS[i]+S[i])%mod; rep(i,M) cumT[i+1]=(cumT[i]+T[i])%mod; ll ans=0; rep(i,N-M+1){ bool ok=true; if((cumS[i+M]+mod-cumS[i])%mod!=cumT[M]*po[i]%mod) ok=false; if((C0[i+M-1]+C1[i+M-1])==0||K<(C0[i+M-1]+C1[i+M-1])) ok=false; if(ok) ans++; } cout << ans << endl; return 0; }