CodeForces 37C(杂题

题意:给出N个01串的长度,任意一个01串不能是另一个串的前缀,要求输出这些串。

开始很迷茫,主要是感觉很难输出,要判定是否有解还是挺容易的。看了下官方题解,由于串的数目一定,可以把所有能用的串都加到队列里,如果数目足够就停止加入。然后就是依次输出,没注意顺序WA了一次,,,,然后代码改得好丑。。

#include<iostream>

#include<map>

#include<algorithm>

#include<cstdio>

#include<cstring>

#include<cstdlib>

#include<vector>

#include<queue>

#include<stack>

#define pb push_back

using namespace std;

typedef long long ll;

const int maxv=1005;

int N;

int a[maxv],b[maxv];

queue<string> Q;

vector<string> ans;

stack<string> xxx[1005];

int main(){

    cin>>N;

    for(int i=0;i<N;i++){

        scanf("%d",&a[i]);

        b[i]=a[i];

    }

    sort(a,a+N);

    int k=0;

    Q.push(string(""));

    int i;

    for(i=0;i<N;i++){

        while(!Q.empty()){

            while(Q.front().size()<a[i]-1){

                string tt=Q.front();Q.pop();

                if(Q.size()<N){

                    Q.push(tt+'0');

                    Q.push(tt+'1');

                }

            }

            string now=Q.front();

            Q.pop();

            if(now.size()<a[i]-1||now.size()>a[i]) continue;

            if(now.size()==a[i]-1){

                ans.pb(now+'1');

                xxx[a[i]].push(now+'1');

                Q.push(now+'0');

                break;

            }else if(now.size()==a[i]){

                ans.pb(now);

                xxx[a[i]].push(now);

                break;

            }

        }

        if(Q.empty()) break;

    }

    if(ans.size()!=N) puts("NO");

    else{

        puts("YES");

        for(int i=0;i<N;i++){

            cout<<xxx[b[i]].top()<<endl;

            xxx[b[i]].pop();

        }

    }

    return 0;

}
View Code

 

你可能感兴趣的:(codeforces)