題目:給出一些字符編碼為不等長的01串,每個長度的編碼從0開始,全為1為終止符, 求給定01串的源碼。
01串由兩部分組成:長度(三位),編碼(以長度為單元,到終止(全為1))。
分析:字符串。這裡首先計算全部編碼的對應01串和長度,然後利用字典樹存儲查詢。
每次先讀取長度,然後按照長度讀取01串,到全為1結束,長度為0結束編碼。
說明:注意數據中間的換行符。
#include <cstring>
#include <cstdio>
// Trie define
#define NODE_SIZE 512
typedef struct _trie_node{
char word;
_trie_node* next[2];
}trie_node;
trie_node dict[NODE_SIZE];
int trie_size;
trie_node* trie_root;
trie_node* trie_new_node()
{
dict[trie_size].next[0] = NULL;
dict[trie_size].next[1] = NULL;
dict[trie_size].word = 0;
return &dict[trie_size ++];
}
void trie_initial()
{
trie_size = 0;
trie_root = trie_new_node();
}
void trie_insert(int bits, int l, char letter)
{
trie_node* now = trie_root;
for (int i = 0; i < l; ++ i) {
if (!now->next[bits%2]) {
now->next[bits%2] = trie_new_node();
}
now = now->next[bits%2];
bits = bits>>1;
}
now->word = letter;
}
char trie_find(int bits, int l)
{
trie_node* now = trie_root;
for (int i = 0; i < l; ++ i) {
if (!now->next[bits%2]) {
return false;
}
now = now->next[bits%2];
bits = bits>>1;
}
return now->word;
}
// Trie define end
// encode list
int encode_value[256];
int encode_length[256];
void make_encode_list()
{
int index = 0;
for (int i = 1; i < 8; ++ i) {
for (int j = 0; j < (1<<i)-1; ++ j) {
encode_value[index] = j;
encode_length[index] = i;
index ++;
}
}
}
int read_bits_code(int length)
{
int value = 0;
for (int i = 0; i < length; ++ i) {
int temp = getchar();
while (temp == '\n') {
temp = getchar();
}
value = value*2 + temp -'0';
}
return value;
}
int read_bits_length()
{
return read_bits_code(3);
}
int main()
{
make_encode_list();
char buf[1024];
while (gets(buf)) {
trie_initial();
for (int i = 0; buf[i]; ++ i) {
trie_insert(encode_value[i], encode_length[i], buf[i]);
}
int bits_length = read_bits_length();
while (bits_length) {
int bits_value = read_bits_code(bits_length);
while (bits_value != (1<<bits_length)-1) {
printf("%c",trie_find(bits_value, bits_length));
bits_value = read_bits_code(bits_length);
}
bits_length = read_bits_length();
}
puts("");
getchar();
}
return 0;
}