CodeForces 913 E. Logical Expression

190 篇文章 2 订阅
84 篇文章 2 订阅

题面

题意

给出x=1111B,y=110011B,z=1010101B,输出一个由x,y,z组成的字符串使其结果为给出的数,且最短,若长度相同,则输出字典序最小的一个.

方法

首先按符号的优先级来划分等级:
0 – (),!
1 – &
2 – |
dp[i][j]表示优先级为i,值为j时的最优表达式.
因此,dp[0][x]=x,dp[0][y]=y,dp[0][z]=z.
一开始想到的做法是BFS,将已知状态通过&(x或y或z),|(x或y或z)来更新.

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
using namespace std;

int n,k,k1,k2,a,b,x=0b00001111,y=0b00110011,z=0b01010101;
string dp[5][300],tmp,tmp2;
bool in[3000];
queue<int>que;
//0 -- (),!
//1 -- &
//2 -- |
bool operator < (string u,string v)
{
	if(u==""||v=="") return v=="";
	if(u.size()!=v.size()) return u.size()<v.size();
	int i;
	for(i=0; i<u.size(); i++)
	{
		if(u[i]!=v[i]) return u[i]<v[i];
	}
	return 0;
}

int main()
{
	int i,j;
	dp[0][x]='x';
	dp[0][y]='y';
	dp[0][z]='z';
	que.push(x);
	que.push(y);
	que.push(z);
	in[x]=in[y]=in[z]=1;
	for(; !que.empty();)
	{
		k=que.front();
		k1=k/300;
		k2=k%300;
		in[que.front()]=0;
		que.pop();
		// !
		a=k2^255;
		if(!k1)
		{
			if(dp[k1][k2].size()==1)
			{
				tmp='!'+dp[k1][k2];
				if(tmp<dp[0][a])
				{
					dp[0][a]=tmp;
					if(!in[a])
					{
						in[a]=1;
						que.push(a);
					}
				}
			}
		}
		else
		{
			tmp="!("+dp[k1][k2]+')';
			if(tmp<dp[0][a])
			{
				dp[0][a]=tmp;
				if(!in[a])
				{
					in[a]=1;
					que.push(a);
				}
			}
		}

		// &
		// x
		a=k2&x;
		if(k1<1)
		{
			if("x&"+dp[k1][k2] < dp[k1][k2]+"&x") tmp="x&"+dp[k1][k2];
			else tmp=dp[k1][k2]+"&x";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else if(k>1)
		{
			if("x&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&x") tmp="x&("+dp[k1][k2]+')';
			else tmp='('+dp[k1][k2]+")&x";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else
		{
			if("x&("+dp[k1][k2]+')' < dp[k1][k2]+"&x") tmp="x&("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"&x";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		// y
		a=k2&y;
		if(k1<1)
		{
			if("y&"+dp[k1][k2] < dp[k1][k2]+"&y") tmp="y&"+dp[k1][k2];
			else tmp=dp[k1][k2]+"&y";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else if(k>1)
		{
			if("y&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&y") tmp="y&("+dp[k1][k2]+')';
			else tmp='('+dp[k1][k2]+")&y";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else
		{
			if("y&("+dp[k1][k2]+')' < dp[k1][k2]+"&x") tmp="y&("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"&y";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		//z
		a=k2&z;
		if(k1<1)
		{
			if("z&"+dp[k1][k2] < dp[k1][k2]+"&z") tmp="z&"+dp[k1][k2];
			else tmp=dp[k1][k2]+"&z";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else if(k>1)
		{
			if("z&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&z") tmp="z&("+dp[k1][k2]+')';
			else tmp='('+dp[k1][k2]+")&z";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else
		{
			if("z&("+dp[k1][k2]+')' < dp[k1][k2]+"&z") tmp="z&("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"&z";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}

		// |
		//x
		a=k2|x;
		if(k1==2)
		{
			if("x|("+dp[k1][k2]+')' < dp[k1][k2]+"|x") tmp="x|("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"|x";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		else
		{
			if("x|"+dp[k1][k2] < dp[k1][k2]+"|x") tmp="x|"+dp[k1][k2];
			else tmp=dp[k1][k2]+"|x";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		//y
		a=k2|y;
		if(k1==2)
		{
			if("y|("+dp[k1][k2]+')' < dp[k1][k2]+"|y") tmp="y|("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"|y";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		else
		{
			if("y|"+dp[k1][k2] < dp[k1][k2]+"|y") tmp="y|"+dp[k1][k2];
			else tmp=dp[k1][k2]+"|y";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		//z
		a=k2|z;
		if(k1==2)
		{
			if("z|("+dp[k1][k2]+')' < dp[k1][k2]+"|z") tmp="z|("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"|z";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		else
		{
			if("z|"+dp[k1][k2] < dp[k1][k2]+"|z") tmp="z|"+dp[k1][k2];
			else tmp=dp[k1][k2]+"|z";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
	}
	cin>>n;
	for(i=1; i<=n; i++)
	{
		scanf("%d",&k);
		k1=0;
		for(j=0; j<=7; j++)
		{
			k1+=k%10*(1 << j);
			k/=10;
		}
		if(dp[0][k1]<dp[1][k1]&&dp[0][k1]<dp[2][k1])
		{
			cout<<dp[0][k1];
		}
		else if(dp[1][k1]<dp[2][k1])
		{
			cout<<dp[1][k1];
		}
		else
		{
			cout<<dp[2][k1];
		}
		puts("");
	}
}

可是11001110就过不了,寻找原因后发现无法在原状态上进行|!x 的操作,于是就天真地增加了&(!x或!y或!z),|(!x或!y或!z)6种操作.

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
using namespace std;

int n,k,k1,k2,a,b,x=0b00001111,y=0b00110011,z=0b01010101;
string dp[5][300],tmp,tmp2;
bool in[3000];
queue<int>que;
//0 -- (),!
//1 -- &
//2 -- |
bool operator < (string u,string v)
{
	if(u==""||v=="") return v=="";
	if(u.size()!=v.size()) return u.size()<v.size();
	int i;
	for(i=0; i<u.size(); i++)
	{
		if(u[i]!=v[i]) return u[i]<v[i];
	}
	return 0;
}

int main()
{
	int i,j;
	dp[0][x]='x';
	dp[0][y]='y';
	dp[0][z]='z';
	que.push(x);
	que.push(y);
	que.push(z);
	in[x]=in[y]=in[z]=1;
	for(; !que.empty();)
	{
		k=que.front();
		k1=k/300;
		k2=k%300;
		in[que.front()]=0;
		que.pop();
		// !
		a=k2^255;
		if(!k1)
		{
			if(dp[k1][k2].size()==1)
			{
				tmp='!'+dp[k1][k2];
				if(tmp<dp[0][a])
				{
					dp[0][a]=tmp;
					if(!in[a])
					{
						in[a]=1;
						que.push(a);
					}
				}
			}
		}
		else
		{
			tmp="!("+dp[k1][k2]+')';
			if(tmp<dp[0][a])
			{
				dp[0][a]=tmp;
				if(!in[a])
				{
					in[a]=1;
					que.push(a);
				}
			}
		}

		// &
		// x
		a=k2&x;
		if(k1<1)
		{
			if("x&"+dp[k1][k2] < dp[k1][k2]+"&x") tmp="x&"+dp[k1][k2];
			else tmp=dp[k1][k2]+"&x";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else if(k>1)
		{
			if("x&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&x") tmp="x&("+dp[k1][k2]+')';
			else tmp='('+dp[k1][k2]+")&x";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else
		{
			if("x&("+dp[k1][k2]+')' < dp[k1][k2]+"&x") tmp="x&("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"&x";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		// y
		a=k2&y;
		if(k1<1)
		{
			if("y&"+dp[k1][k2] < dp[k1][k2]+"&y") tmp="y&"+dp[k1][k2];
			else tmp=dp[k1][k2]+"&y";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else if(k>1)
		{
			if("y&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&y") tmp="y&("+dp[k1][k2]+')';
			else tmp='('+dp[k1][k2]+")&y";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else
		{
			if("y&("+dp[k1][k2]+')' < dp[k1][k2]+"&x") tmp="y&("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"&y";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		//z
		a=k2&z;
		if(k1<1)
		{
			if("z&"+dp[k1][k2] < dp[k1][k2]+"&z") tmp="z&"+dp[k1][k2];
			else tmp=dp[k1][k2]+"&z";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else if(k>1)
		{
			if("z&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&z") tmp="z&("+dp[k1][k2]+')';
			else tmp='('+dp[k1][k2]+")&z";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else
		{
			if("z&("+dp[k1][k2]+')' < dp[k1][k2]+"&z") tmp="z&("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"&z";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		// !x
		a=k2&(255^x);
		if(k1<1)
		{
			if("!x&"+dp[k1][k2] < dp[k1][k2]+"&!x") tmp="!x&"+dp[k1][k2];
			else tmp=dp[k1][k2]+"&!x";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else if(k>1)
		{
			if("!x&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&!x") tmp="!x&("+dp[k1][k2]+')';
			else tmp='('+dp[k1][k2]+")&!x";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else
		{
			if("!x&("+dp[k1][k2]+')' < dp[k1][k2]+"!&x") tmp="!x&("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"&!x";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		// !y
		a=k2&(255^y);
		if(k1<1)
		{
			if("!y&"+dp[k1][k2] < dp[k1][k2]+"&!y") tmp="!y&"+dp[k1][k2];
			else tmp=dp[k1][k2]+"&!y";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else if(k>1)
		{
			if("!y&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&!y") tmp="!y&("+dp[k1][k2]+')';
			else tmp='('+dp[k1][k2]+")&!y";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else
		{
			if("!y&("+dp[k1][k2]+')' < dp[k1][k2]+"&!y") tmp="!y&("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"&!y";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		//!z
		a=k2&(255^z);
		if(k1<1)
		{
			if("!z&"+dp[k1][k2] < dp[k1][k2]+"&!z") tmp="!z&"+dp[k1][k2];
			else tmp=dp[k1][k2]+"&!z";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else if(k>1)
		{
			if("!z&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&!z") tmp="!z&("+dp[k1][k2]+')';
			else tmp='('+dp[k1][k2]+")&!z";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}
		else
		{
			if("!z&("+dp[k1][k2]+')' < dp[k1][k2]+"&!z") tmp="!z&("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"&!z";
			if(tmp<dp[1][a])
			{
				dp[1][a]=tmp;
				if(!in[a+300])
				{
					in[a+300]=1;
					que.push(a+300);
				}
			}
		}

		// |
		//x
		a=k2|x;
		if(k1==2)
		{
			if("x|("+dp[k1][k2]+')' < dp[k1][k2]+"|x") tmp="x|("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"|x";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		else
		{
			if("x|"+dp[k1][k2] < dp[k1][k2]+"|x") tmp="x|"+dp[k1][k2];
			else tmp=dp[k1][k2]+"|x";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		//y
		a=k2|y;
		if(k1==2)
		{
			if("y|("+dp[k1][k2]+')' < dp[k1][k2]+"|y") tmp="y|("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"|y";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		else
		{
			if("y|"+dp[k1][k2] < dp[k1][k2]+"|y") tmp="y|"+dp[k1][k2];
			else tmp=dp[k1][k2]+"|y";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		//z
		a=k2|z;
		if(k1==2)
		{
			if("z|("+dp[k1][k2]+')' < dp[k1][k2]+"|z") tmp="z|("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"|z";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		else
		{
			if("z|"+dp[k1][k2] < dp[k1][k2]+"|z") tmp="z|"+dp[k1][k2];
			else tmp=dp[k1][k2]+"|z";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		//!x
		a=k2|(255^x);
		if(k1==2)
		{
			if("!x|("+dp[k1][k2]+')' < dp[k1][k2]+"|!x") tmp="!x|("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"|!x";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		else
		{
			if("!x|"+dp[k1][k2] < dp[k1][k2]+"|!x") tmp="!x|"+dp[k1][k2];
			else tmp=dp[k1][k2]+"|!x";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		//!y
		a=k2|(255^y);
		if(k1==2)
		{
			if("!y|("+dp[k1][k2]+')' < dp[k1][k2]+"|!y") tmp="!y|("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"|!y";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		else
		{
			if("!y|"+dp[k1][k2] < dp[k1][k2]+"|!y") tmp="!y|"+dp[k1][k2];
			else tmp=dp[k1][k2]+"|!y";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		//!z
		a=k2|(255^z);
		if(k1==2)
		{
			if("!z|("+dp[k1][k2]+')' < dp[k1][k2]+"|!z") tmp="!z|("+dp[k1][k2]+')';
			else tmp=dp[k1][k2]+"|!z";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
		else
		{
			if("!z|"+dp[k1][k2] < dp[k1][k2]+"|!z") tmp="!z|"+dp[k1][k2];
			else tmp=dp[k1][k2]+"|!z";
			if(tmp<dp[2][a])
			{
				dp[2][a]=tmp;
				if(!in[a+600])
				{
					in[a+600]=1;
					que.push(a+600);
				}
			}
		}
	}
	cin>>n;
	for(i=1; i<=n; i++)
	{
		scanf("%d",&k);
		k1=0;
		for(j=0; j<=7; j++)
		{
			k1+=k%10*(1 << j);
			k/=10;
		}
//		cout<<dp[0][k1]<<" "<<dp[1][k1]<<" "<<dp[2][k1];
		//*
		if(dp[0][k1]<dp[1][k1]&&dp[0][k1]<dp[2][k1])
		{
			cout<<dp[0][k1];
		}
		else if(dp[1][k1]<dp[2][k1])
		{
			cout<<dp[1][k1];
		}
		else
		{
			cout<<dp[2][k1];
		}
		puts("");
		//*/
	}
}

可惜过不了01001001,后来发现这种做法无法应对|(…)的形式,因而不得不改变做法.
正确做法是不断地暴力更新状态,将一下几个操作循环进行:
1.将优先级为2的通过加上括号变为优先级为0的:
dp[i][0]=min(dp[i][0], ‘(’+dp[i][2]+’)’ );
为了进行"非"运算

2.枚举并进行"非"运算:
dp[i ^ 255][0]=min(dp[i ^ 255][0], ’ ! '+dp[i][0] );

3.将优先级为0的变为优先级为1的:
dp[i][1]=min(dp[i][1], dp[i][0] );
为了进行"与"运算,且优先级1能做的0都能做

4.枚举并进行"与"运算
dp[i&j][0]=min(dp[i&j][0], dp[i][0]+’&’+dp[j][0] );

5.将优先级为0的变为优先级为1的:
dp[i][2]=min(dp[i][2], dp[i][1] );
为了进行"或"运算,作用与3相似

6.枚举并进行"或"运算
dp[i | j][0]=min(dp[i | j][0], dp[i][0]+’|’+dp[j][0] );

当6个操作均无法操作时就停止循环,每次输入一个数后取3个优先级种的最小值即可.

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;

int n,k,k1,k2,a,b,x=0b00001111,y=0b00110011,z=0b01010101;
string dp[5][300],tmp,tmp2;
bool have;
//0 -- (),!
//1 -- &
//2 -- |
bool operator < (string u,string v)
{
	if(u==""||v=="") return v=="";
	if(u.size()!=v.size())return u.size()<v.size();
	int i;
	for(i=0; i<u.size(); i++)
	{
		if(u[i]!=v[i]) return u[i]<v[i];
	}
	return 0;
}

int main()
{
	int i,j;
	dp[0][x]='x';
	dp[0][y]='y';
	dp[0][z]='z';

	for(have=1; have;)
	{
		have=0;
		// ()
		for(i=0; i<=255; i++)
		{
			if(dp[2][i]=="") continue;
			tmp='('+dp[2][i]+')';
			if(tmp<dp[0][i])
			{
				have=1;
				dp[0][i]=tmp;
			}
		}

		// !
		for(i=0; i<=255; i++)
		{
			if(dp[0][i]=="") continue;
			tmp='!'+dp[0][i];
			if(tmp<dp[0][i^255])
			{
				have=1;
				dp[0][i^255]=tmp;
			}
		}

		// &
		for(i=0; i<=255; i++)
		{
			if(dp[0][i]=="") continue;
			if(dp[0][i]<dp[1][i])
			{
				have=1;
				dp[1][i]=dp[0][i];
			}
		}
		for(i=0; i<=255; i++)
		{
			if(dp[1][i]=="") continue;
			for(j=0; j<=255; j++)
			{
				if(dp[1][j]=="") continue;
				tmp=dp[1][i]+'&'+dp[1][j];
				if(tmp<dp[1][i&j])
				{
					have=1;
					dp[1][i&j]=tmp;
				}
			}
		}

		// |
		for(i=0; i<=255; i++)
		{
			if(dp[1][i]=="") continue;
			if(dp[1][i]<dp[2][i])
			{
				have=1;
				dp[2][i]=dp[1][i];
			}
		}
		for(i=0; i<=255; i++)
		{
			if(dp[2][i]=="") continue;
			for(j=0; j<=255; j++)
			{
				if(dp[2][j]=="") continue;
				tmp=dp[2][i]+'|'+dp[2][j];
				if(tmp<dp[2][i|j])
				{
					have=1;
					dp[2][i|j]=tmp;
				}
			}
		}
	}
 
	cin>>n;
	for(i=1; i<=n; i++)
	{
		scanf("%d",&k);
		k1=0;
		for(j=0; j<=7; j++)
		{
			k1+=k%10*(1 << j);
			k/=10;
		}
		if(dp[0][k1]<dp[1][k1]&&dp[0][k1]<dp[2][k1])
		{
			cout<<dp[0][k1];
		}
		else if(dp[1][k1]<dp[2][k1])
		{
			cout<<dp[1][k1];
		}
		else
		{
			cout<<dp[2][k1];
		}
		puts("");
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值