打表 + STL函数(map)
一开始被卡在如何打 0 00 01 10…… 这个序列了
之后找了一下规律
发现
1->0
2 ->00 01 10
3 ->000 001 010 011 100 101 110
………………
就是先确定每组编码长度,之后用二进制填补就可以了
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<set>
#include<stack>
#include<queue>
#include<list>
using namespace std;
#define MAXD 500 + 10
string Set_str[MAXD];
int size = 0;
void biao(){
for(int i = 1; i < 8 ; i++){
char str[10L];
int sum = 1;
for(int n = 0 ; n < i; n++) sum = sum * 2;
sum --;
for(int n = 0 ; n < sum ; n ++){
for(int j = 0 ; j < i ; j++) str[j] = '0';
str[i] = '\0';
int pos = i - 1;
int t = n;
while(t){
str[pos--] = t % 2 + '0';
t = t / 2;
}
Set_str[size++] = str;
}
}
return ;
}
int main(){
char str[10000];
biao();
while(gets(str) != NULL){
map<string,char>dict;
char ans[10000];
int ans_size = 0;
for(int i = 0 ; i < strlen(str) ; i++){
dict[Set_str[i]] = str[i];
}
while(true){
int sum = 0; char m;
for(int i = 0 ; i < 3;){
m = getchar();
if(m == '1' || m == '0'){
sum = sum * 2 + m - '0';
i++;
}
}
if(sum == 0) break; /*编码文本结束*/
string break_str = "";
for(int i = 0; i < sum ; i++) break_str += "1";
while(true){
string _str = "";
for(int i = 0; i < sum ;){
m = getchar();
if(m == '1') {_str += "1"; i ++;}
if(m == '0') {_str += "0"; i ++;}
}
if(_str == break_str) break;
else{
ans[ans_size++] = dict[_str];
}
}
}
ans[ans_size] = '\0';
puts(ans);
getchar();
}
return 0;
}