非正解代码0pts求助
查看原帖
非正解代码0pts求助
1039274
Cypher_404楼主2025/8/4 10:42

求助万能的谷民,个人所写的暴力做法,但是集:WA,AC,TLE,MLE 于一身,求 DeBug。

思路:

  • 开始有三个字符串,他们的长度一定互不相同(除非都是 1),找到一个字符串的长度是另外两个字符串的长度之和,并且那个字符串可以被另外的两个字符串拼接组成。
  • dfs 暴力查找能否将剩下的两个字符串拆开。

注释放在代码里了。提交记录

//#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;
}
2025/8/4 10:42
加载中...