false.cpp
#include <cstdio>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <limits.h>
#include <map>
#include <queue>
#include <vector>
#include <set>
#include <stack>
#include <bitset>
#include <string>
using namespace std;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef set<int> si;
typedef set<ii> sii;
#define MP make_pair
#define PB push_back
#define REP(i,a) for ( int i = 0; i < int(a); i++)
#define FOR(i,a,b) for ( int i = int(a); i<=int(b); i++)
#define FORD(i,a,b) for(int i= int(a); i>=int(b); i--)
const int INF = 1<<29;
typedef long long int ll;
char crypted[20000];
int tail;
int head;
char nmb[1024];
char line[1024];
char morse[30][6] = {".-",
"-...",
"-.-.",
"-..",
".",
"..-.",
"--.",
"....",
"..",
".---",
"-.-",
".-..",
"--",
"-.",
"---",
".--.",
"--.-",
".-.",
"...",
"-",
"..-",
"...-",
".--",
"-..-",
"-.--",
"--..",
"..--", /* _ */
".-.-", /* , */
"---.", /* . */
"----", }; /* ? */
void add(char* c){
while ( *c ) {
crypted[tail++] = *c++;
}
}
void code() {
int len = strlen(line);
for ( int i = 0; i<len; i++) {
switch( line[i] ) {
default:
add( morse[ line[i]-'A'] );
nmb[i] = strlen( morse[line[i]-'A'] );
break;
case '_' :
add(morse[26]) ;
nmb[i] = 4;
break;
case ',':
add(morse[27]);
nmb[i] = 4;
break;
case '.':
add(morse[28]);
nmb[i] = 4;
break;
case '?':
add(morse[29]);
nmb[i] = 4;
break;
}
}
}
char getNext(int len) {
int i = 0;
for(;i<=29; i++){
if (strlen(morse[i])==len && !strncmp(morse[i],crypted+head, len ) ) break;
}
head+=len;
switch( i ){
default:
return i+'A';
case 26:
return '_';
case 27:
return ',';
case 28:
return '.';
case 29:
return '?';
}
}
void decode(){
int len = strlen(line);
FOR(i,0,len-1){
line[i] = getNext( nmb[len-i-1] );
// printf("len:%d ~ %d : ",nmb[len-i-1], i);
printf("%c", line[i]);
}
}
int main(){
while( scanf(" %s", line) >0 ) {
tail = head = 0;
code();
decode();
printf("\n");
//printf("%d\n", line);
}
return 0;
}