1. 程式人生 > 實用技巧 >華東202011月賽補題

華東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; }