码迷,mamicode.com
首页 > 其他好文 > 详细

CodeForces 37C(杂题

时间:2015-06-11 01:47:31      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

题意:给出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 37C(杂题

标签:

原文地址:http://www.cnblogs.com/Cw-trip/p/4567895.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!