82 lines
2.5 KiB
C++
82 lines
2.5 KiB
C++
#include <bits/stdc++.h>
|
||
|
||
//阅读材料:https://blog.csdn.net/mrcrack/article/details/52122765
|
||
|
||
/**
|
||
* C语言中1<<i表示将1的二进制每位想左移动i位,末位补0。
|
||
左移运算符(<<)是C语言中的一种常见的运算符,一般用法可以通过下面的例子讲解来说明:
|
||
如:1<<5 由于1的二进制为0000 0001,左移5位就是将每位向左移动5位,末位补0,所以1<<5后结果为0010 0000,转换为十进制就是32。
|
||
*/
|
||
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;
|
||
}
|