You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
2.4 KiB

2 years ago
#include <bits/stdc++.h>
//阅读材料https://blog.csdn.net/mrcrack/article/details/52122765
/**
* C1<<i1i0
(<<)C
1<<5 10000 00015501<<50010 000032
*/
char codes[8][1 << 8];
//1左移8位表示100000000-->二进制->转十进制--> 256 这挺会玩啊~这么做也对,因为既然要把这道题考虑成二进制,
// 那么出现的组合个数按左移N位来思考也是正常的
//读取一个有用字符,小函数,辅助函数
int readchar() {
char ch;
while (true) {
//读啊读~回车换行符不要,
ch = getchar();
if (ch != '\r' && ch != '\n')
return ch;
}
}
//读取代码
int readcodes() {
int len;
int i;
char ch;
//清空codes数组,初始化为0
memset(codes, 0, sizeof(codes));
//读入第一个非换行的字符
codes[1][0] = readchar();
//从第2个开始使用getchar进行读取
for (len = 2; len <= 7; len++) //7是极限表示不会超过7位二进制
//第一轮次,读取字符
for (i = 0; i < (1 << len) - 1; i++) {
ch = getchar();
//结束就不用继续了~
if (ch == EOF)
return 0;
//如果是换行符,就继续下一轮
if (ch == '\n')
return 1;
//读取到指定位置
codes[len][i] = ch;
}
return 1;
}
//读取二进制数字转为十进制数比如读取c=3个长度封装成十进制数
int readint(int c) {
int v = 0;
while (c--) {
v = v * 2 + readchar() - '0';
}
return v;
}
int main() {
int len;
int i;
//读取代码,不断的读取测试用例
while (readcodes()) {
//在一个用例中开始进行分析
while (true) {
len = readint(3);
if (len == 0)
break;
while (true) {
i = readint(len);
if (i == (1 << len) - 1)
break;
putchar(codes[len][i]);
}
}
putchar('\n');
}
return 0;
}