题意:给出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; }