求助万能的谷民,个人所写的暴力做法,但是集:WA,AC,TLE,MLE 于一身,求 DeBug。
思路:
注释放在代码里了。提交记录
//#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
string a,b,c;
int T;
int len1,len2,len3;//这表示的是a,b,c字符串的长度
bool dfs(string s1,string s2)
{
int u=s1.size();
int v=s2.size();
if(u==v)
{
if(u==1)
{
return 1;
}
// cout<<s1<<' '<<s2<<'\n';
return 0;
}
if(u<v)//始终让长度更长的那个放在前面
{
swap(u,v);
swap(s1,s2);
}
bool ret=0;
if(s1.substr(0,v)==s2)//如果可以提取出另一个字符串(题目要求所以只能在头或者末尾)
{
ret=dfs(s1.substr(v),s2);
}
if(ret==1)//找到答案
{
return 1;
}
if(s1.substr(u-v)==s2)//在末尾的情况
{
return dfs(s1.substr(0,u-v),s2);
}
return 0;
}
void solve()
{
bool flag[3]={0,0,0};
if(len1==len2&&len2==len3&&len3==1)//特判
{
if(a=="a"&&b=="b"&&c=="c")
{
cout<<"YES\n";
return;
}
cout<<"NO\n";
return;
}
for(int i=1;i<=len1;i++)
{
flag[a[i-1]-97]=1;
}
for(int i=1;i<=len2;i++)
{
flag[b[i-1]-97]=1;
}
for(int i=1;i<=len3;i++)//检查字符串是否由两种字母组成
{
flag[c[i-1]-97]=1;
}
if(flag[0]+flag[1]+flag[2]!=2)
{
cout<<"NO\n";
return;
}
if(len1==len2+len3)//说明a可能由b和c组成,后面同理
{
if((a.substr(0,len2)==b&&a.substr(len2)==c)||(a.substr(0,len3)==c&&a.substr(len3)==b)) //提取字符串
{
if(dfs(b,c))
// if(1)
{
cout<<"YES\n";
return;
}
}
cout<<"NO\n";
return;
}
if(len2==len1+len3)
{
if((b.substr(0,len1)==a&&b.substr(len1)==c)||(b.substr(0,len3)==c&&b.substr(len3)==a))
{
if(dfs(a,c))
// if(1)
{
cout<<"YES\n";
return;
}
}
cout<<"NO\n";
return;
}
if(len3==len2+len1)
{
if((c.substr(0,len2)==b&&c.substr(len2)==a)||(c.substr(0,len1)==a&&c.substr(len1)==b))
{
if(dfs(b,a))
// if(1)
{
cout<<"YES\n";
return;
}
}
cout<<"NO\n";
return;
}
cout<<"NO\n";
return;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>T;
while(T--)
{
cin>>a>>b>>c;
len1=a.size();
len2=b.size();
len3=c.size();
solve();
}
return 0;
}