問題

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0111。

解法

シュミレーション問題かな

コード

string encode(string code){
  map<char, string> m;
  m[A] = "00000";
  m[B] = "00001";
  m[C] = "00010";
  m[D] = "00011";
  m[E] = "00100";
  m[F] = "00101";
  m[G] = "00110";
  m[H] = "00111";
  m[I] = "01000";
  m[J] = "01001";
  m[K] = "01010";
  m[L] = "01011";
  m[M] = "01100";
  m[N] = "01101";
  m[O] = "01110";
  m[P] = "01111";
  m[Q] = "10000";
  m[R] = "10001";
  m[S] = "10010";
  m[T] = "10011";
  m[U] = "10100";
  m[V] = "10101";
  m[W] = "10110";
  m[X] = "10111";
  m[Y] = "11000";
  m[Z] = "11001";
  m[ ] = "11010";
  m[.] = "11011";
  m[,] = "11100";
  m[-] = "11101";
  m[] = "11110";
  m[?] = "11111";
  string ret = "";
  rep(i, code.size())
    ret += m[code[i]];

  return ret;
}

string decode(string code){
  string ret = "";

  map<string, char>m;
  m["101"] =  ;
  m["000000"] = ;
  m["000011"] = ,;
  m["10010001"] = -;
  m["010001"] = .;
  m["000001"] = ?;
  m["100101"] = A;
  m["10011010"] = B;
  m["0101"] = C;
  m["0001"] = D;
  m["110"] = E;
  m["01001"] = F;
  m["10011011"] = G;
  m["010000"] = H;
  m["0111"] = I;
  m["10011000"] = J;
  m["0110"] = K;
  m["00100"] = L;
  m["10011001"] = M;
  m["10011110"] = N;
  m["00101"] = O;
  m["111"] = P;
  m["10011111"] = Q;
  m["1000"] = R;
  m["00110"] = S;
  m["00111"] = T;
  m["10011100"] = U;
  m["10011101"] = V;
  m["000010"] = W;
  m["10010010"] = X;
  m["10010011"] = Y;
  m["10010000"] = Z;

  rep(i, code.size()){
    string tmp = "";
    REP(j, i, code.size()){
      tmp += code[j];
      if(m.count(tmp) == 0) continue;
      //      cout << tmp << endl;

      ret += m[tmp];
      i = j;
      break;
    }
  }
  return ret;
}

int main(){
string str;

string encode(string code){
  map<char, string> m;
  m[A] = "00000";
  m[B] = "00001";
  m[C] = "00010";
  m[D] = "00011";
  m[E] = "00100";
  m[F] = "00101";
  m[G] = "00110";
  m[H] = "00111";
  m[I] = "01000";
  m[J] = "01001";
  m[K] = "01010";
  m[L] = "01011";
  m[M] = "01100";
  m[N] = "01101";
  m[O] = "01110";
  m[P] = "01111";
  m[Q] = "10000";
  m[R] = "10001";
  m[S] = "10010";
  m[T] = "10011";
  m[U] = "10100";
  m[V] = "10101";
  m[W] = "10110";
  m[X] = "10111";
  m[Y] = "11000";
  m[Z] = "11001";
  m[ ] = "11010";
  m[.] = "11011";
  m[,] = "11100";
  m[-] = "11101";
  m[] = "11110";
  m[?] = "11111";
  string ret = "";
  rep(i, code.size())
    ret += m[code[i]];

  return ret;
}

string decode(string code){
  string ret = "";

  map<string, char>m;
  m["101"] =  ;
  m["000000"] = ;
  m["000011"] = ,;
  m["10010001"] = -;
  m["010001"] = .;
  m["000001"] = ?;
  m["100101"] = A;
  m["10011010"] = B;
  m["0101"] = C;
  m["0001"] = D;
  m["110"] = E;
  m["01001"] = F;
  m["10011011"] = G;
  m["010000"] = H;
  m["0111"] = I;
  m["10011000"] = J;
  m["0110"] = K;
  m["00100"] = L;
  m["10011001"] = M;
  m["10011110"] = N;
  m["00101"] = O;
  m["111"] = P;
  m["10011111"] = Q;
  m["1000"] = R;
  m["00110"] = S;
  m["00111"] = T;
  m["10011100"] = U;
  m["10011101"] = V;
  m["000010"] = W;
  m["10010010"] = X;
  m["10010011"] = Y;
  m["10010000"] = Z;

  rep(i, code.size()){
    string tmp = "";
    REP(j, i, code.size()){
      tmp += code[j];
      if(m.count(tmp) == 0) continue;

      ret += m[tmp];
      i = j;
      break;
    }
  }
  return ret;
}

int main(){
  string str;
  while(getline(cin, str)){
    cout << decode(encode(str)) << endl;
  }
  return 0;
}

map使うと簡単だね