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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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;
}