テストアルゴリズムトレーニングビットコンプレッサー
問題の説明
データ圧縮の目的は、データの保管および交換時に発生する冗長性を減らすことです。これにより、有効なデータの割合が増加し、伝送速度が向上します。:バイナリシーケンスを圧縮する方法があるようである
(注:置換が場合に発生し、この置換は、バイナリストリングの全体の長さを減少させる場合のみ)は、n-1の連続するバイナリ表現がNで置換されている
(翻訳者注:連続1の周りのnは0または文字列の最初と最後でなければなりません)
例:11111111001001111111111111110011は10000010011110011に圧縮されます。元の文字列の長さは32で、圧縮された文字列の長さは17です。
この方法の欠点は、解凍アルゴリズムが複数の元の文字列を取得することがあり、元の文字列が何であるかを判断できないことがあります。圧縮された情報を使用して元の文字列を判別できるかどうかを判別するプログラムを作成してください。元の文字列の長さL、元の文字列の1の数N、および圧縮された文字列を指定します。
L <= 16 Kバイト、圧縮された文字列の長さ<= 40ビット。
入力形式
最初の2つの整数L、N、意味は問題の説明と同じです
2行目は、圧縮された文字列を表すバイナリ文字列です
出力形式
出力 "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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
// 转自: https://blog.csdn.net/a1439775520
static int l;
static int n;
static int ans=0;
static int len;
static char[] s;
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter wr=new BufferedWriter(new OutputStreamWriter(System.out));
String []nm=br.readLine().split(" ");
l=Integer.parseInt(nm[0]);
n=Integer.parseInt(nm[1]);
s=br.readLine().toCharArray();
// wr.write(Arrays.toString(s));
len=s.length;
dfs(0,0,0);
//wr.write(ans+" ");
//wr.write(" "+l+" "+n+" "+len);
if(ans>=2){
wr.write("NOT UNIQUE");
}
else if(ans==1)
{
wr.write("YES");
}
else
{
wr.write("NO");
}
wr.close();
}
static void dfs(int i,int num,int curlen)
{
if(ans>=2||num>n||curlen>l){return;}
if(i>=len)
{
if(curlen==l&&num==n)
{
ans++;
}
return;
}
if(s[i]=='0')
{
dfs(i+1,num,curlen+1);
return;
}
if(i!=0&&s[i-1]=='1')
{
dfs(i+1,num+1,curlen+1);
return;
}
dfs(i+1,num+1,curlen+1);
int tem=0;
for (int j=i;j<len;j++)
{
//
tem*=2;
tem+=s[j]-'0';
if (tem+num>n||tem+curlen>l)
{
break;
}
if(tem>j-i+1&&(j+1==len||(j+1<len&&s[j+1]=='0')))
{dfs(j+1,num+tem,tem+curlen);}
}
}
}