Hola 2018 E

El significado de los problemas

decirle X , y , de x, y, z , y ! , | , 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 s t r yo norte sol cuerda 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 y \ & , lo mejor ! ! Y entre paréntesis.
X , y , de x, y, z 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 9 9 transferencia Zhong.
medio es 4 4 especies.
La vuelta más elevada de su propia 1 1 especies.
Los soportes son más bajos 2 2 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;
    }
}

Publicados 203 artículos originales · ganado elogios 17 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/mxYlulu/article/details/104272216
Recomendado
Clasificación