El significado de los problemas
decirle , y elementos con los operadores y paréntesis, compuesto por ocho cadena binaria que desea.
solución del problema
Me encontré por primera vez con
como una matriz de transferencia, hasta el conocimiento.
Considere prioridad.
Para un operador, el número debe ser mayor que dos prioridades.
Así que hemos creado tres matrices, lo que representa la prioridad más baja que es
, Medio
, lo mejor
Y entre paréntesis.
puede ser.
Es el significado de la expresión gama, el último cálculo del tiempo se basa en lo final.
Debido a que sólo las operaciones de alta prioridad en la operación carácter de baja prioridad cuando es necesario agregar paréntesis, por lo
Puede ser visto como un paréntesis.
Cuando la transferencia, debido a la incertidumbre del orden, por lo que trasladado varias veces, hasta que la transferencia de conocimiento no puede ser eficaz.
Escribir una versión en línea simple, es decir, el proceso de transferencia continúa tomando mínimo.
Escribí un cambio relativamente violencia, no es más que tres casos, cambio violento.
Al parecer, la prioridad más baja se puede asignar libremente alta prioridad, es
transferencia Zhong.
medio es
especies.
La vuelta más elevada de su propia
especies.
Los soportes son más bajos
Zhong
Dado que el mínimo requerido longitud después mínima garantizada lexicográfico, no se compara directamente cadena.
#include<bits/stdc++.h>
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define sf(x) scanf("%d",&x)
typedef long long ll;
using namespace std;
const ll mod = 998244353;
const int maxn = 2e5+500;
int n;
string E[256],T[256],F[256];//|| & !
bool flag=true;
void update(string &A,string B){
if(A=="")A=B,flag=1;
else{
if(A.size()>B.size())A=B,flag=1;
else if(A.size()==B.size()&&A>B)A=B,flag=1;
}
}
void slove(){
int x=0,y=0,z=0;
for(int i=0;i<8;i++)if(i/4)x|=1<<i;F[x]="x";
for(int i=0;i<8;i++)if((i/2)%2)y|=1<<i;F[y]="y";
for(int i=0;i<8;i++)if(i%2)z|=1<<i;F[z]="z";
while(flag){
flag=0;
for(int i=0;i<256;i++){
for(int j=0;j<256;j++){
if(E[i].size()&&E[j].size())update(E[i|j],E[i]+'|'+E[j]);
if(E[i].size()&&T[j].size())update(E[i|j],E[i]+'|'+T[j]);
if(T[i].size()&&E[j].size())update(E[i|j],T[i]+'|'+E[j]);
if(E[i].size()&&F[j].size())update(E[i|j],E[i]+'|'+F[j]);
if(F[i].size()&&E[j].size())update(E[i|j],F[i]+'|'+E[j]);
if(T[i].size()&&T[j].size())update(E[i|j],T[i]+'|'+T[j]);
if(F[i].size()&&T[j].size())update(E[i|j],F[i]+'|'+T[j]);
if(T[i].size()&&F[j].size())update(E[i|j],T[i]+'|'+F[j]);
if(F[i].size()&&F[j].size())update(E[i|j],F[i]+'|'+F[j]);
}
}
// cout<<E[248]<<"->"<<F[248]<<"->"<<T[248]<<endl;
for(int i=0;i<256;i++){
for(int j=0;j<256;j++){
if(T[i].size()&&T[j].size())update(T[i&j],T[i]+'&'+T[j]);
if(F[i].size()&&T[j].size())update(T[i&j],F[i]+'&'+T[j]);
if(T[i].size()&&F[j].size())update(T[i&j],T[i]+'&'+F[j]);
if(F[i].size()&&F[j].size())update(T[i&j],F[i]+'&'+F[j]);
}
}
//cout<<E[248]<<"->"<<F[248]<<"->"<<T[248]<<endl;
for(int i=0;i<256;i++)if(E[i]!="")update(F[i],'('+E[i]+')');//变为最高优先级
for(int i=0;i<256;i++)if(T[i]!="")update(F[i],'('+T[i]+')');//变为最高优先级
for(int i=0;i<256;i++)if(F[i]!="")update(F[i^255],'!'+F[i]);//运算的字符串的优先级必须大于等于运算符
//for(int i=0;i<256;i++)cout<<i<<" "<<E[i]<<" "<<T[i]<<" "<<F[i]<<endl;
//puts("?");
if(!flag)break;
}
}
int main(){
slove();
cin>>n;
FOR(i,1,n){
string st;cin>>st;
int now=0;
for(int j=0;j<8;j++){
if(st[j]=='1')now|=1<<j;
}
string str;
//cout<<now<<endl;
update(str,E[now]);
update(str,F[now]);
update(str,T[now]);
cout<<str<<endl;
}
}