Codeforces Beta Round #37 C. Old Berland Language dfs+构造

2 篇文章 0 订阅
1 篇文章 0 订阅

题面 : 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值