こんにちは2018 E

問題の意味

あなたに教えます バツ から X、Y、Z 、および | 、|、\& あなたが欲しい8つのバイナリ列からなる演算子と括弧付き要素。

問題の解決策

私が最初に会いました S トン R n個 グラム ストリング 転写配列、アップ知識として。
優先順位を考えてみましょう。
オペレータのために、数は、2つの優先度よりも大きくなければなりません。
だから我々は、最も低い優先度を表す、3つの配列を設定しました | | 、ミディアム \& ,最高 そして括弧。
バツ から X、Y、Z であってもよいです。
発現アレイの意味は、前回の計算はどのようなエンドに基づいています。
あなたがそう、括弧を追加する必要がある場合、優先順位の低い文字の操作のみで優先度の高い事業ので、 カッコとして見ることができます。

理由は不確定注文の転送は、私たちがするまで、数回転送すると、知識の移転は効果的にすることはできません。
転送プロセスは、最小を取るために続けて、ある簡単なオンライン版を、書きます。
私は単純に3例、暴力的なシフトであり、比較的暴力シフトを書きました。
どうやら最低の優先度が自由に高い優先順位を割り当てることができ、それがあります 9 9 忠転送。
媒体であります 4 4 種。
高いターン自分自身を 1 1 種。
ブラケットが低く、 2 2

最小は辞書最低保証後の長さを必要とするので、それが直接の文字列を比較していません。

#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;
    }
}

公開された203元の記事 ウォン称賛17 ビュー20000 +

おすすめ

転載: blog.csdn.net/mxYlulu/article/details/104272216