UVA-213 Message Decoding(文字列を入力し、単一文字を操作する入出力)

10834 ワード


POINT:
1つの符号化を表すことについて:code文字配列を利用して1つの符号化文字を表し、code[len][val]は長さlen、バイナリ値valの文字を表す.
 
主な手順は次のとおりです.
 1 #include <iostream>
 2 #include <sstream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <string>
 7 #include <vector>
 8 #include <set>
 9 #include <cctype>
10 #include <algorithm>
11 #include <cmath>
12 #include <deque>
13 #include <queue>
14 #include <map>
15 #include <stack>
16 #include <list>
17 #include <iomanip>
18 
19 using namespace std;
20 #define INF 0x7fffffff
21 #define maxn 1010
22 typedef unsigned long long ull;
23 
24 int code[8][1<<8];
25 
26 int main()
27 {
28     while(readcodes())
29     {
30         //printcodes();
31         for(;;)
32         {
33             int len = readint(3);
34             if(len == 0)    break;
35             //printf("len = %d
", len);
36 37 for(;;) 38 { 39 int v = readint(len); 40 //printf("v = %d
", v);
41 if(v == (1<<len)-1) break; 42 putchar(code[len][v]); 43 } 44 } 45 putchar('
'); 46 } 47 return 0; 48 }

 
ここでreadcodes()関数は番号を読み出すために使用され、readint()関数はcビットのバイナリ文字を読み出し、整数(val)に変換するために使用される.
「エンコードされたテキストは複数行で構成できます」の処理方法
 1 bool readcodes()
 2 {
 3     memset(code, 0, sizeof(code));// 
 4     code[1][0] = readchar();//
 5     for(int len = 2; len <= 7; len++)
 6     {
 7         for(int val = 0; val < (1<<len)-1; val++)
 8         {
 9             int ch = getchar();
10             if(ch == EOF)   return 0;
11             if(ch == '
' || ch == '\r') return 1; 12 13 code[len][val] = ch; 14 } 15 } 16 return 1; 17 } 18 int readint(int c) 19 { 20 int v = 0; 21 while(c--) 22 v = v*2+readchar()-'0'; 23 return v; 24 }

readchar()関数コードは次のとおりです.
1 int readchar()
2 {
3     for(;;)
4     {
5         int ch = getchar();
6         if(ch != '
' && ch != '\t') return ch; 7 } 8 }

 
また,Printcodes()関数自体は問題には要求されないが,デバッグコードには有用である.