fs.cpp
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<climits>
#include<algorithm>
#include<utility>
#include<string>
#include<deque>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
using namespace std;
#define REP(i,N) for (int i = 0; i < (N); i++)
#define FOR(i,a,b) for (int i = (a); i <= (b); i++)
#define FORI(i,a,b) for (int i = (a); i < (b); i++)
#define FORD(i,a,b) for (int i = (a)-1; i >= (b); i--)
#define DP(arg...) fprintf(stderr, ## arg)
typedef long long ll;
typedef long double ld;
typedef pair<int,int> ii;
map<string, int> rev;
const char * morse[33]={
".-","-...","-.-.","-..",".",
"..-.","--.","....","..",".---",
"-.-",".-..","--","-.","---",
".--.","--.-",".-.","...","-",
"..-","...-",".--","-..-","-.--","--..",
"..--",".-.-","---.","----",
};
int lengths[33];
char input[4444];
char decoded[4444];
int lenstr[4444];
int code(char c){
if(c>='A' && c<='Z')
return c-'A';
if(c=='_')
return 26;
if(c==',')
return 27;
if(c=='.')
return 28;
if(c=='?')
return 29;
}
char uncode(int c){
if(c>=0 && c<=25)
return c+'A';
if(c==26)
return '_';
if(c==27)
return ',';
if(c==28)
return '.';
if(c==29)
return '?';
}
void solve() {
int L = strlen(input);
int current = 0;
for(int i=0;i<L;++i){
int dec = code(input[i]);
strcpy(decoded+current, morse[dec]);
current+=lengths[dec];
lenstr[i] = lengths[dec];
}
current = 0;
for(int i=0;i<L;++i){
int l = lenstr[L-i-1];
char tt[10];
for(int j=0;j<l;++j)
tt[j] = decoded[current+j];
tt[l]=0;
current+=l;
int ou = rev[tt];
putchar(uncode(ou));
}
putchar('\n');
}
int main() {
for(int i=0;i<30;++i){
lengths[i]=strlen(morse[i]);
rev[morse[i]]=i;
}
while (scanf(" %s", input) != EOF) {
solve();
}
return 0;
}