算法训练 Bit Compressor

原文地址:https://blog.csdn.net/Raymond_YP/article/details/104450936
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  数据压缩的目的是为了减少存储和交换数据时出现的冗余。这增加了有效数据的比重并提高了传输速率。有一种压缩二进制串的方法是这样的:
  将连续的n个1替换为n的二进制表示(注:替换发生当且仅当这种替换减少了二进制串的总长度)
  (译者注:连续的n个1的左右必须是0或者是串的开头、结尾)
  比如:11111111001001111111111111110011会被压缩成10000010011110011。原串长为32,被压缩后串长为17.
  这种方法的弊端在于,有时候解压缩算法会得到不止一个可能的原串,使得我们无法确定原串究竟是什么。请你写一个程序来判定我们能否利用压缩后的信息来确定原串。给出原串长L,原串中1的个数N,以及压缩后的串。
  L<=16 Kbytes,压缩后的串长度<=40 bits。
输入格式
  第一行两个整数L,N,含义同问题描述
  第二行一个二进制串,表示压缩后的串
输出格式
  输出"YES"或"NO"或"NOT UNIQUE"(不包含引号)
  分别表示:
  YES:原串唯一
  NO:原串不存在
  NOT UNIQUE:原串存在但不唯一
样例输入
样例1:
32 26
10000010011110011
样例2:
9 7
1010101
样例3:
14 14
111111
样例输出
样例1:YES
样例2:NOT UNIQUE
样例3:NO

看注释,比上一个借鉴更清晰一点

#include
#include
#define maxn 50
int L,l,N;
char data[maxn];
int answer;
void dfs(int i,int length,int num_1)		//i是原串第i个字符,length是变换后的串长,num_1是变换后串的1累计个数 
{
	//这里面的 i是超过原字符串后才终止 
	if(i>l)
	{
		if(length==L&&num_1==N)
			answer++;
		return;
	}
	if(length>L||num_1>N||answer>=2)	//不符合条件,返回 
		return;
	//下面是没办法扩展 直接进入下一层 (也就是下一位) 
	if(data[i]=='0') 
	{
		dfs(i+1,length+1,num_1);
		return;
	}
	//下面这个是可以扩展,但是不扩展,直接进入下一层 
	dfs(i+1,length+1,num_1+1);
	//下面我们把符合扩展条件的扩展后 然后进入下一层 
	long long temp=0;
	for (int j=i;j<=l;j++) 
	{
		temp*=2;
		temp+=data[j]-'0';
		if(temp+num_1>N||temp+length>L)     //扩展超了 
			break;
		if(temp>j-i+1&&data[j+1]!='1')		//压缩的串1比原来不压缩的多,并且下一个位置为0或者末尾 ,如果下一位是1 那么我们压缩的时候就不能在这压缩 
			dfs(j+1,temp+length,num_1+temp);
	}
}
int main() 
{
	scanf("%d",&L);
	scanf("%d",&N);
	scanf("%s",data+1);
	l=strlen(data+1);
	answer=0;
	dfs(1,0,0);
	if(answer==0)
		printf("NO"); 
	else if(answer==1)
		printf("YES"); 
		else
		    printf("NOT UNIQUE");
	return 0;
}

你可能感兴趣的:(算法)