大意和题目介绍:
点击链接
ps:自己太懒了,当时也是参考大神代码才理解的。
题解:
主要是对三个操作优先级的划分,然后要想要可以用dp状态来表示每个操作,这样以后就简单许多了。
还有一个就是直接输入二进制的话就是int tmp = 0b00111;
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define fir first
#define se second
const int maxn = 2e5+10;
typedef pair<int,int> pii;
string dp[3][1005];
int x = 0b00001111,y = 0b00110011,z = 0b01010101,ma = 255,flag = 1; //0b--二进制
void update(string &a,const string &b) {
if(a == "" || b.size() < a.size()) {
a = b;
flag = 1;
}
else if(b.size() == a.size() && b < a) {
a = b;
flag = 1;
}
return ;
}
void init() {
dp[0][x] = "x";
dp[0][y] = "y";
dp[0][z] = "z";
while(flag) {
flag = 0;
for(int i = 0;i < 256;i++) { //更新!操作
if(dp[0][i] == "") continue;
update(dp[0][i^ma],"!"+dp[0][i]);
}
for(int i = 0;i < 256;i++) { //更新&操作
if(dp[1][i] == "") continue;
for(int j = 0;j < 256;j++) {
if(dp[0][j] == "") continue;
update(dp[1][i&j],dp[1][i]+"&"+dp[0][j]);
}
}
for(int i = 0;i < 256;i++) { //更新|操作
if(dp[2][i] == "") continue;
for(int j = 0;j < 256;j++) {
if(dp[1][j] == "") continue;
update(dp[2][i|j],dp[2][i]+"|"+dp[1][j]);
}
}
for(int i = 0;i < 256;i++) { //往下更新
if(dp[0][i] != "") {
update(dp[1][i],dp[0][i]);
}
if(dp[1][i] != "") {
update(dp[2][i],dp[1][i]);
}
}
for(int i = 0;i < 256;i++) { //往回更新
if(dp[2][i] == "") continue;
update(dp[0][i],"(" + dp[2][i] + ")");
}
}
}
int main() {
init();
int n;
cin>>n;
for(int i = 1;i <= n;i++) {
string tmp;
cin>>tmp;
int num = 0,ba = 1;
for(int i = tmp.size()-1;i >= 0;i--) {
num += (tmp[i]-'0')*ba;
ba *= 2;
}
cout<<dp[2][num]<<endl;
}
}
好像已经好久好久没有写博客了,这个学期比赛打的一塌糊涂,自己也不够用心。
你可长点心吧!
加油~~