T1
code
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5,M=1e3+5;
int n,m,ans=0;
char s[N],t[M];
int nxt[M];
int f[N][M];
int g[M][30];
void getnxt(){nxt[1]=0;int j=0;for(int i=2;i<=m;++i){while(j>0&&t[i]!=t[j+1]) j=nxt[j];if(t[i]==t[j+1]) ++j;nxt[i]=j;}
}
void getval(){for(int i=0;i<m;++i){for(int c=0;c<26;++c){int j=i;while(j>0&&c!=t[j+1]-'a') j=nxt[j];if(c==t[j+1]-'a') ++j;g[i][c]=j;
// cout<<i<<" "<<c<<" "<<g[i][c]<<endl;}}
}
//int calc(int pos,char c){
// int j=pos;
// while(j>0&&c!=t[j+1]) j=nxt[j];
// if(c==t[j+1]) ++j;
// cout<<pos<<" "<<c<<" "<<j<<endl;
// return j;
//}
int main(){freopen("neck.in","r",stdin);freopen("neck.out","w",stdout);cin>>s+1;cin>>t+1;n=strlen(s+1);m=strlen(t+1);getnxt();getval();for(int i=0;i<n;++i)for(int j=0;j<m;++j){int val=g[j][s[i+1]-'a'];f[i+1][j]=max(f[i+1][j],f[i][j]);if(val==m) continue;f[i+1][val]=max(f[i+1][val],f[i][j]+1);}for(int i=0;i<m;++i)ans=max(ans,f[n][i]);printf("%d\n",ans);fclose(stdin);fclose(stdout);return 0;
}