此题用以纪念————第一次被Finals打倒在地上瑟瑟发抖的代某
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <time.h> #include <ctype.h> #include <queue> #include <stack> #include <vector> #include <algorithm> #include <iostream> using namespace std; int code[8][1<<8]; int readchar() {//一个一个跨行读取 for(;;) { int ch = getchar(); if(ch != '\n' && ch != '\r')// \r回车 { return ch; } } } int readint(int c) {//把这一串01001换成十进制 从高拆到低 c is length int v = 0; while(c--) { v = v * 2 + readchar() - '0'; } return v; } int readcodes() { memset(code, 0, sizeof code); code[1][0] = readchar();//先读第一个 用这函数略去多组的开头换行 for(int len = 2; len <= 7; len++) { for(int i = 0; i < (1 << len) - 1; i++) { int ch = getchar(); if(ch == EOF) { return 0;//结束了 下面没有样例了 } if(ch == '\n' || ch == '\r') { return 1;//结束了 下回还有样例 } code[len][i] = ch;//不是上面那两个if 那你肯定是我在找的编码头 }//len 长度 i 对应的二进制所对应的十进制 } return 1; } int main() { while(readcodes())//编码头读到code[][]里面去 //printcodes(); { for(;;) {//这是一路读 一路输出 int len = readint(3);//括号里的是二进制化十进制的二进制数长度 if(!len) {//000 收尾 break; } //printf("%d\n",len); for(;;) { int v = readint(len); //printf("%d\n",v); if(v == (1 << len) - 1)//最后111111...了就读完了 { break; } putchar(code[len][v]);//读一组输出一个码 } } putchar('\n'); } return 0; }