题面 : https://codeforces.com/problemset/problem/37/C
题意 : 给出一些长度,让你只用0,1构造出这些长度的串,使得没有一个串是另一个的前缀.
题解 : 感觉自己已经废了,我竟然想着怎样把这些串一个一个dfs,还在考虑用map来判断该串是否出现过。把长度排序,然后一次dfs,若出现了我们当前要的最小的长度,就存下来,然后直接return,因为之后的点一定不用查了。然后每次加0和1。没了。。。
#include<bits/stdc++.h>
using namespace std;
struct node
{
int l,id;
string str;
}a[1010];
int nn,n;
bool pd;
bool cmp(node aa,node bb){return aa.l<bb.l;}
bool cmp1(node aa,node bb){return aa.id<bb.id;}
void dfs(int len,string str1)
{
if(len==a[nn].l)
{
a[nn].str=str1;
nn++;
if(nn==n+1)pd=true;
return;
}
dfs(len+1,str1+"0");
if(pd==true)return;
dfs(len+1,str1+"1");
if(pd==true)return;
}
int main()
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++){scanf("%d",&a[i].l);a[i].id=i;}
sort(a+1,a+n+1,cmp);
nn=1;pd=false;
dfs(0,"");
if(pd==false)printf("NO");
else
{
printf("YES\n");
sort(a+1,a+n+1,cmp1);
for(i=1;i<=n;i++)cout<<a[i].str<<endl;
}
return 0;
}