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()関数自体は問題には要求されないが,デバッグコードには有用である.