题意:问a串中能否找出子串等于b串,可以正着找,也可以逆着找。
思路:两边最长公共子序列,看长度能都否等于b串长度。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[105][105];
char a[105],b[105];
int la,lb,ans;
void LCS()
{
memset(f,0,sizeof(f));
for(int i=0;i<la;i++)
{
for(int j=0;j<lb;j++)
{
if(a[i]==b[j])f[i+1][j+1]=f[i][j]+1;
else f[i+1][j+1]=max(f[i+1][j],f[i][j+1]);
}
}
ans=max(ans,f[la][lb]);
memset(f,0,sizeof(f));
for(int i=0;i<la;i++)
{
for(int j=0;j<lb;j++)
{
if(a[i]==b[lb-j-1])f[i+1][j+1]=f[i][j]+1;
else f[i+1][j+1]=max(f[i+1][j],f[i][j+1]);
}
}
ans=max(ans,f[la][lb]);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ans=0;
scanf("%s%s",a,b);
la=strlen(a);
lb=strlen(b);
LCS();
if(ans==lb)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}