资源限制
时间限制: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
using namespace std;
int l,n;
string a;
int zero;
int ans,len;
//1010101
void dfs(int loc,int t_zero,int t_one){//loc为当前串的位置索引,t_zero为当前0的数量,t_one为当前1的数量
if(ans > 1) return;
if(loc > l) return;
if(t_zero > zero ) return;
if(t_one > n) return;
if(loc == len){
if(t_zero == zero && t_one == n){
ans++;
return;
}
}
int tempzero = t_zero;
while(a[loc] == '0'){
tempzero++;
loc++;
}
int tempone = 1;//当前1的个数
for(int i = loc;i <len;i++,tempone = tempone*2+(a[i]=='1')){
if(tempone == 2) continue;//当原串为10的时候
if(a[i+1] == '1') continue;
int next = i+1;
while(a[next] == '0') next++;
dfs(next,tempzero+next-i-1,t_one+tempone);
if(tempone == 3) dfs(next,tempzero+next-i-1,t_one+2);//处理11
}
}
int main(){
cin>>l>>n;
cin>>a;
len=a.length();
zero = l-n;//原串为零的数量
dfs(0,0,0);
if(ans == 1){
cout<<"YES";
}else{
if(ans > 1){
cout<<"NOT UNIQUE";
}
else{
cout<<"NO";
}
}
return 0;
}