#include<stdio.h>
#include<string.h>

#define SIGN_LENGTH 9//符号の文字列の最大の長さ
#define CIPHER_NUM 32//符号と文字の組み合わせの数
#define CODE_MAX 801//文字→符号に変換するとき、符号の文字列の最大数
#define INITIALIZE_NUL 0x00 //char型の初期値
#define INITIALIZE_CHAR '0' //5文字ごとに区切り、格納する配列に足りない文字数に"0"を追加することを考慮した初期値
#define INITIALIZE_INT 0 //整数型の初期値
#define LAST_CHAR '\0' //文字列の最後を判定する文字
#define TEXT_LENGTH_MAX 101//入力において最大文字数
#define SECTION 5 //5文字区切り

typedef struct cipher
{
	char charcter_change_sign[SIGN_LENGTH];//文字→符号にする時に扱う符号を格納
	char sign_change_charcter[SECTION + 1];//符号→文字にする時に扱う符号を格納
	char character;// 文字を格納
}CIPHER;

/*二つの表から文字と符号を対応させた初期化*/
const CIPHER code[CIPHER_NUM] = {
		{"100101", "00000", 'A'},
		{"10011010", "00001", 'B'},
		{"0101", "00010", 'C'},
		{"0001", "00011", 'D'},
		{"110", "00100", 'E'},
		{"01001", "00101", 'F'},
		{"10011011", "00110", 'G'},
		{"010000", "00111", 'H'},
		{"0111", "01000", 'I'},
		{"10011000", "01001", 'J'},
		{"0110", "01010", 'K'},
		{"00100", "01011", 'L'},
		{"10011001", "01100", 'M'},
		{"10011110", "01101", 'N'},
		{"00101", "01110", 'O'},
		{"111", "01111", 'P'},
		{"10011111", "10000", 'Q'},
		{"1000", "10001", 'R'},
		{"00110", "10010", 'S'},
		{"00111", "10011", 'T'},
		{"10011100", "10100", 'U'},
		{"10011101", "10101", 'V'},
		{"000010", "10110", 'W'},
		{"10010010", "10111", 'X'},
		{"10010011", "11000", 'Y'},
		{"10010000", "11001", 'Z'},
		{"101", "11010", ' '},
		{"010001", "11011", '.'},
		{"000011", "11100", ','},
		{"10010001", "11101", '-'},
		{"000000", "11110", '\''},
		{"000001", "11111", '?'}
	};

int main(void)
{
	
	/*変数宣言と初期化*/
	unsigned short i = INITIALIZE_INT;
	unsigned short j = INITIALIZE_INT;
	unsigned short k = INITIALIZE_INT;
	char input_text[TEXT_LENGTH_MAX];//入力値を格納
	
	/*入力文字列の初期化*/
	for(i = 0; i < TEXT_LENGTH_MAX; i++)
	{
		input_text[i] = INITIALIZE_NUL;
	}
	
	while(gets(input_text) != NULL)
	{
		unsigned short text_length = INITIALIZE_INT;//入力文字列の長さを格納
		unsigned short sign_length = INITIALIZE_INT;//符号と符号を連結させた文字列の長さを格納
		unsigned short element_number = INITIALIZE_INT;//要素番号を格納
		unsigned short match_count = INITIALIZE_INT;//文字比較の時に一致した回数をカウント
		unsigned short character_length = INITIALIZE_INT;//符号→文字にした時の文字列の長さを格納
		char barcode[CODE_MAX];//文字→符号にした文字列を連結して格納
		char code_fivecut[CODE_MAX / SECTION][SECTION];//符号を5つ区切りにしたものを格納
		
		/*配列の初期化*/
		for(i = 0; i < CODE_MAX; i++)
		{
			barcode[i] = INITIALIZE_NUL;
		}
		
		for(i = 0; i < CODE_MAX / SECTION; i++)
		{
			for(j = 0; j < SECTION; j++)
			{
				code_fivecut[i][j] = INITIALIZE_CHAR;
			}
		}
		
		/*入力文字列のカウント*/
		for(i = 0; INITIALIZE_NUL != input_text[i] ; i++,text_length++);
		
		/*文字を対応する符号に置き換えて連結して一つの配列(barcode)に格納する*/
		for(i = 0; i < text_length; i++)
		{
			for(j = 0; j < CIPHER_NUM; j++)
			{
				if(input_text[i] == code[j].character)
				{
					strcat(barcode, code[j].charcter_change_sign);
				}
			}
		}
		
		/*連結した符号(barcode)の文字列の長さをカウントする*/
		for(i = 0; LAST_CHAR != barcode[sign_length]; i++,sign_length++);
		
		/*連結した符号(barcode)を5つ区切りに分ける*/
		for(i = 0; i < sign_length; i++)
		{
			for(j = 0; j < SECTION; j++)
			{
				if(element_number < sign_length)
				{
					code_fivecut[i][j] =  barcode[element_number];
					element_number++;
				}
			}
		}
		
		/*5つ区切りにした個数のカウント*/
		for(i = 0; i < CODE_MAX ; i+= SECTION)
		{
			if(sign_length <= i)
			{
				character_length = i / SECTION;
				break;
			}
		}
		
		/*5つ区切りにした文字列と符号の比較を行い、一致したとき対応する文字を出力する*/
		for(i = 0; i < character_length; i++)
		{
			for(j = 0; j < CIPHER_NUM; j++)
			{
				for(k = 0; k < SECTION; k++)
				{
					if(code_fivecut[i][k] == code[j].sign_change_charcter[k])
					{
						match_count++;
					}
				}
				if(SECTION == match_count)
				{
					printf("%c", code[j].character);
				}
				match_count = INITIALIZE_INT;
			}
		}
		printf("\n");
	}
	
	return 0;
}

Measured memory_bytes: 524