fs.cpp
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <utility>
#include <string>
#include <deque>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
using namespace std;
//#define debug printf
#define debug blackhole
void blackhole(...) {}
char* morse[] = {
"A", ".-", "B", "-...", "C", "-.-.", "D", "-..", "E", ".",
"F", "..-.", "G", "--.", "H", "....", "I", "..", "J", ".---",
"K", "-.-", "L", ".-..", "M", "--", "N", "-.", "O", "---",
"P", ".--.", "Q", "--.-", "R", ".-.", "S", "...", "T", "-",
"U", "..-", "V", "...-", "W", ".--", "X", "-..-", "Y", "-.--", "Z", "--..", "_", "..--", ",", ".-.-", ".", "---.", "?", "----",
NULL
};
char into[10000];
char input[10000];
char output[10000];
int lengths_n;
int lengths[10000];
void go_into() {
int j = 0;
for (int i = 0; input[i]; i++) {
int k;
for (k = 0; morse[2*k]; k++) {
if (morse[2*k][0] == input[i]) {
break;
}
}
if (!morse[2*k]) { printf("ERROR (failed to find %c)", input[i]); exit(2); }
for (int kk = 0; morse[2*k+1][kk]; kk++) {
into[j++] = morse[2*k+1][kk];
}
}
into[j++] = '\0';
lengths_n = 0;
for (int i = 0; input[i]; i++) {
int k;
for (k = 0; morse[2*k]; k++) {
if (morse[2*k][0] == input[i]) {
break;
}
}
if (!morse[2*k]) { printf("ERROR"); exit(2); }
lengths[lengths_n++] = strlen(morse[2*k+1]);
}
debug("lengths:");
for (int qq = 0; qq < lengths_n; qq++) {
debug("%d", lengths[qq]);
}
debug("\n");
}
void go_from() {
debug("into: %s", into);
int j = 0, ol=0;
for (int k = 0; k < lengths_n; k++) {
int length = lengths[lengths_n - k - 1];
char mor[100];
int l;
for (l = 0; l < length; l++) {
mor[l] = into[j++];
}
mor[l] = '\0';
for (l = 0; morse[2*l]; l++) {
if (strcmp(morse[2*l+1], mor) == 0) {
break;
}
}
if (!morse[2*l]) { printf("ERROR not found %s", mor); exit(2); }
output[ol++] = morse[2*l][0];
}
output[ol++]='\0';
}
int main() {
do {
if (scanf("%s", input) != 1) break;
go_into();
go_from();
printf("%s\n", output);
} while (true);
return 0;
}