security.cpp
#include <cstdlib>
#include <cstdio>
#include <map>
#include <string>
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
map<char,string> ctm;
map<string,char> mtc;
void init(){
ctm.insert(make_pair<char,string>('A',".-"));
ctm.insert(make_pair<char,string>('B',"-..."));
ctm.insert(make_pair<char,string>('C',"-.-."));
ctm.insert(make_pair<char,string>('D',"-.."));
ctm.insert(make_pair<char,string>('E',"."));
ctm.insert(make_pair<char,string>('F',"..-."));
ctm.insert(make_pair<char,string>('G',"--."));
ctm.insert(make_pair<char,string>('H',"...."));
ctm.insert(make_pair<char,string>('I',".."));
ctm.insert(make_pair<char,string>('J',".---"));
ctm.insert(make_pair<char,string>('K',"-.-"));
ctm.insert(make_pair<char,string>('L',".-.."));
ctm.insert(make_pair<char,string>('M',"--"));
ctm.insert(make_pair<char,string>('N',"-."));
ctm.insert(make_pair<char,string>('O',"---"));
ctm.insert(make_pair<char,string>('P',".--."));
ctm.insert(make_pair<char,string>('Q',"--.-"));
ctm.insert(make_pair<char,string>('R',".-."));
ctm.insert(make_pair<char,string>('S',"..."));
ctm.insert(make_pair<char,string>('T',"-"));
ctm.insert(make_pair<char,string>('U',"..-"));
ctm.insert(make_pair<char,string>('V',"...-"));
ctm.insert(make_pair<char,string>('W',".--"));
ctm.insert(make_pair<char,string>('X',"-..-"));
ctm.insert(make_pair<char,string>('Y',"-.--"));
ctm.insert(make_pair<char,string>('Z',"--.."));
ctm.insert(make_pair<char,string>('_',"..--"));
ctm.insert(make_pair<char,string>(',',".-.-"));
ctm.insert(make_pair<char,string>('.',"---."));
ctm.insert(make_pair<char,string>('?',"----"));
for( map<char,string>::iterator it = ctm.begin(); it != ctm.end(); it++ ){
mtc.insert(make_pair<string,char>(it->second,it->first));
}
}
void decode( const string & line ){
string morse;
stack<int> s;
//cout << line << endl;
for( size_t i = 0; i < line.size(); i++ ){
string & tmp = ctm[line[i]];
morse+=tmp;
// cout << tmp << " ";
s.push(tmp.size());
}
//cout << endl;
//cerr << morse << endl;
int pos = 0;
while(!s.empty()){
//cout << pos << endl;
int l = s.top(); s.pop();
// cout << morse.substr(pos,l) << " ";
putchar(mtc[morse.substr(pos,l)]);
pos+=l;
}
putchar('\n');
}
int main( int argc, char ** argv ){
init();
string line;
while( getline(cin,line) ){
decode(line);
}
return 0;
}