社区讨论

关于输出

灌水区参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m2ir8lfx
此快照首次捕获于
2024/10/21 16:28
去年
此快照最后确认于
2024/10/21 19:19
去年
查看原帖
为啥我这么写,后两项不会正常输出,只会输出0
CPP
int main()
{
	scanf("%s",str+1);
	change();
	build();
	printf("%d\n%d %d",dfs(cnt),ans_1,ans_2);
	return 0;
}
但是这么写就正常输出了
CPP
int main()
{
	scanf("%s",str+1);
	change();
	build();
	printf("%d\n",dfs(cnt));
	printf("%d %d",ans_1,ans_2);
	return 0;
}
input:
CPP
0&(1|0)|(1|1|1&0)
out:
CPP
1
1 2
完整程序
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
int ans_1,ans_2;
char str[N];
vector<char>ope;
vector<char>suf;
struct node
{
	int v,l,r;
}tree[N];
int cnt;
vector<int>sta;
void change()
{
	int n=strlen(str+1);
	for(int i=1;i<=n;i++)
	{
		if(str[i]=='|')
		{
			while(!ope.empty()&&ope.back()!='(')
			{
				suf.push_back(ope.back());
				ope.pop_back();
			}
			ope.push_back(str[i]);
		}
		else if(str[i]=='&')
		{
			while(!ope.empty()&&ope.back()=='&')
			{
				suf.push_back(ope.back());
				ope.pop_back();
			}
			ope.push_back(str[i]);
		}
		else if(str[i]=='(')
		{
			ope.push_back(str[i]);
		}
		else if(str[i]==')')
		{
			while(ope.back()!='(')
			{
				suf.push_back(ope.back());
				ope.pop_back();
			}
			ope.pop_back();
		}
		else
		{
			suf.push_back(str[i]);
		}
	}
	while(!ope.empty())
	{
		suf.push_back(ope.back());
		ope.pop_back();
	}
}
void build()
{
	for(int i=0;i<suf.size();i++)
	{
		if(suf[i]=='|')
		{
			int r=sta.back();
			sta.pop_back();
			int l=sta.back();
			sta.pop_back();
			tree[++cnt]=(node){2,l,r};
			sta.push_back(cnt);
		}
		else if(suf[i]=='&')
		{
			int r=sta.back();
			sta.pop_back();
			int l=sta.back();
			sta.pop_back();
			tree[++cnt]=(node){3,l,r};
			sta.push_back(cnt);
		}
		else
		{
			tree[++cnt]=(node){suf[i]-'0'};
			sta.push_back(cnt);
		}
	}
}
int dfs(int u)
{
//	cout<<u<<' '<<tree[u].v<<' '<<tree[u].l<<' '<<tree[u].r<<endl;
	if(tree[u].v==0||tree[u].v==1)
	{
		return tree[u].v;
	}
	else if(tree[u].v==2)
	{
		int tmp=dfs(tree[u].l);
		if(tmp==1)
		{
			ans_2++;
			return 1;
		}
		else
		{
			return dfs(tree[u].r);
		}
	}
	else
	{
		int tmp=dfs(tree[u].l);
		if(tmp==0)
		{
			ans_1++;
			return 0;
		}
		else
		{
			return dfs(tree[u].r);
		}
	}
}
int main()
{
	scanf("%s",str+1);
	change();
	build();
	printf("%d\n",dfs(cnt));
	printf("%d %d",ans_1,ans_2);
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...