min(30,30)求助!!!
查看原帖
min(30,30)求助!!!
576111
Frederick123楼主2022/11/3 21:21

记录详情

#include<bits/stdc++.h>
typedef long long ll;
const int INF=2e8;
const ll LLINF=LLONG_MAX;
const int N=1000007;
using namespace std;
void swap(int &a,int &b);
inline int read();
inline int write(int);
char s[N],e[N];
stack<char> op;
stack<int> st;
int lchild[N],rchild[N];
//bool data[N];
int data[N];
int sc1[N];
int sc2[N];
int find_data(int i)
{
	if(rchild[i]==-1||lchild[i]==-1)
	{
		sc1[i]=0;
		sc2[i]=0;
		data[i]=e[i]-48;
		return 0;
	}
	find_data(lchild[i]);
	find_data(rchild[i]);
	/*if(e[i]=='|'&&data[lchild[i]]==1)
		sc1[i]=sc1[lchild[i]]+1,
		sc2[i]=sc2[lchild[i]];
	if(e[i]=='&'&&data[lchild[i]]==0)
		sc2[i]=sc2[lchild[i]]+1,
		sc1[i]=sc1[lchild[i]];
	if(e[i]=='|')
		data[i]=(data[lchild[i]]||data[rchild[i]]);
	if(e[i]=='&')
		data[i]=(data[lchild[i]]&&data[rchild[i]]);
	*/
	if(e[i]=='|')
	{
		sc2[i]=sc2[lchild[i]]+sc2[rchild[i]];
		if(data[lchild[i]]==1)
			sc1[i]=sc1[lchild[i]]+1;
		else
			sc1[i]=sc1[lchild[i]]+sc1[rchild[i]];
		data[i]=(data[lchild[i]]||data[rchild[i]]);
		return 0;
	}
	if(e[i]=='&')
	{
		sc1[i]=sc1[lchild[i]]+sc1[rchild[i]];
		if(data[lchild[i]]==0)
			sc2[i]=sc2[lchild[i]]+1;
		else
			sc2[i]=sc2[lchild[i]]+sc2[rchild[i]];
		data[i]=(data[lchild[i]]&&data[rchild[i]]);
		return 0;
	}
	write(114514);
	exit(-1);
}
int main(int argc,char **argv)
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0); 
	scanf("%s",s);
	int j=0;
	memset(lchild,-1,sizeof(lchild));
	memset(rchild,-1,sizeof(rchild)); 
	for(int i=0;i<strlen(s);i++)
	{
		if(isdigit(s[i]))
		{
			e[j++]=s[i];
			continue;
		}
		if(op.empty())
		{
			op.push(s[i]);
			continue;
		}
		if((s[i]=='&'&&op.top()=='|')||s[i]=='(')
		{
			op.push(s[i]);
			continue;
		}
		if(s[i]==')')
		{
			while(op.top()!='(')
			{
				e[j++]=op.top();
				op.pop();
			}
			op.pop();
			continue;
		}
		if(op.top()=='(')
		{
			op.push(s[i]);
			continue;
		}
		while(op.top()!='(')
		{
			e[j++]=op.top();
			op.pop();
			if(op.empty())break;
		}
		op.push(s[i]);
	}
	//printf("%s\n",e);
	while(!op.empty())
	{
		e[j++]=op.top();
		op.pop();
	}
	//printf("%s\n",e);
	/*
	for(int i=0;i<strlen(e);i++)
	{
		if(isdigit(e[i]))
		{
			st.push(e[i]-48);
			continue;
		}
		int x=st.top()-48;st.pop();
		int y=st.top()-48;st.pop();
		if(e[i]=='|')st.push(x||y);
		if(e[i]=='&')st.push(x&&y);
	}
	write(st.top());
	putchar(10);
	st.pop();*/
	for(int i=0;i<strlen(e);i++)
	{
		if(isdigit(e[i]))
		{
			st.push(i);
			continue;
		}
		rchild[i]=st.top();st.pop();
		lchild[i]=st.top();st.pop();
		st.push(i);
	}
	find_data(strlen(e)-1);
	//for(int i=0;i<strlen(e);i++)
	//write((int)data[i]);
	//putchar(10);
	//for(int i=0;i<strlen(e);i++)
	//write(0);
	//putchar(10);
	write(data[strlen(e)-1]);
	putchar(10);
	write(sc2[strlen(e)-1]);
	putchar(32);
	write(sc1[strlen(e)-1]);
	putchar(10);
	/*printf("%s\n",e);
	for(int i=0;i<strlen(e);i++)
	write(sc1[i]);
	putchar(32);
	putchar(10);
	for(int i=0;i<strlen(e);i++)
	write(sc2[i]);
	putchar(32);;*/
	return 0;
}
inline int read()
{
	char ch=getchar();
	int x=0,f=1;
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
inline int write(int x)
{
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10+'0');
	return x;
}
void swap(int &a,int &b)
{
	a = a^b;
    b = a^b;
    a = a^b;
}

2022/11/3 21:21
加载中...