https://codeforces.com/problemset/problem/1303/E
枚举断点,然后dp[i][j]表示用s串的前i位,已经匹配了t串的前j位,断点后的第二段可以匹配多少
#include<bits/stdc++.h>
using namespace std;
const int maxl=410;
int ans,slen,tlen;
int a[maxl],f[maxl][maxl];
char s[maxl],t[maxl];
inline void prework()
{
scanf("%s",s+1);
scanf("%s",t+1);
slen=strlen(s+1);
tlen=strlen(t+1);
}
inline void mainwork()
{
ans=0;int d=1;
for(int i=1;i<=slen;i++)
{
if(s[i]==t[d])
d++;
if(d>tlen)
{
ans=1;
return;
}
}
for(int cut=1;cut<tlen;cut++)
{
memset(f,-1,sizeof(f));
f[0][0]=0;
for(int i=1;i<=slen;i++)
for(int j=0;j<=cut;j++)
{
if(f[i-1][j]>=0)
f[i][j]=f[i-1][j];
if(s[i]==t[j])
{
if(f[i-1][j-1]>=0)
f[i][j]=max(f[i][j],f[i-1][j-1]);
}
if(s[i]==t[cut+f[i-1][j]+1])
{
if(f[i-1][j]>=0)
f[i][j]=max(f[i][j],f[i-1][j]+1);
}
if(f[i][cut]>=tlen-cut)
ans=1;
}
}
}
inline void print()
{
if(ans)
puts("YES");
else
puts("NO");
}
int main()
{
int t=1;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}