华东202011月赛补题

E. 布尔表达式

题意:

给一个n,一个长度为pow(2,n)长度的01串s;

构造一个布尔表达式f(a1,a2,…,an)

对于s的第i个值表示当i二进制表示时

每位对于aj使得表达式的值为s[i]

解法:

对于s[i]=0不用处理

对于s[i]=1输出其主析取范式即可

如果s串全为0,则输出0

AC代码:

#include<bits/stdc++.h>

using namespace std;
int n,siz;
bool flag=0;
void solve(int now){
    vector<int> v;
    int cnt=1;
    for(int i=0;i<n;i++){
        if(now&cnt)
            v.push_back(1);
        else
            v.push_back(0);
        cnt<<=1;
    }
    reverse(v.begin(),v.end());
    if(flag){
        cout<<"O ";
    }else{
        flag=1;
    }
    /*
    for(int i=0;i<n;i++)
        cout<<v[i]<<' ';
    cout<<endl;
    */
    for(int i=0;i<n;i++){
        if(v[i]){
            if(i)
                cout<<"A ";
            cout<<'a'<<i+1;
            if(now!=siz-1||i!=n-1)
                cout<<' ';
        }else{
            if(i)
                cout<<"A ";
            cout<<"N a"<<i+1;
            if(now!=siz-1||i!=n-1)
                cout<<' ';
        }
    }
}
int main(){
    cin>>n;
    string s;
    cin>>s;
    siz=s.length();
    for(int i=0;i<siz;i++){
        if(s[i]-'0')
            solve(i);
    }
    if(s.find('1')==-1) cout<<0<<endl;
}
原文地址:https://www.cnblogs.com/xuanzo/p/14099187.html