#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define SAFE printf("Safe\n");
char * shift(char * str, int k)
{
char * decoded = (char *)malloc(251);
int i;
strcpy(decoded, str);
for(i=0; decoded[i]; i++)
{
int num;
if(isalpha(decoded[i]))
{
num = decoded[i] - 'A' + 1;
}
else
{
num = 0;
}
num+=k;
if(num>26)
num-=27;
if(!num)
{
decoded[i] = ' ';
}
else
{
decoded[i] = num + 'A' - 1;
}
}
decoded[i] = 0;
return decoded;
}
int countWords(char ** dictionary, char *str)
{
int count = 0;
char word[21];
FILE * stream = fmemopen(str,strlen(str),"r");
while(fscanf(stream, "%s",word)>0)
{
int i = 0;
for(i; dictionary[i]; i++)
{
if(!strcmp(word,dictionary[i]))
{
//printf("%s matches %s in the dictionary!\n",word,dictionary[i]);
count++;
continue;
}
else
{
//printf("%s does not match %s in the dictionary\n",word,dictionary[i]);
}
}
}
fclose(stream);
return count;
}
int main()
{
char ** dictionary = (char **)malloc(100);
memset(dictionary,0,100);
int i = 0;
while(1)
{
char * word = (char *)malloc(22);
//scanf("%s",word);
fgets(word, 22, stdin);
word[strlen(word)-1] = 0;
if(strcmp(word,"#"))
{
dictionary[i] = word;
i++;
}
else
{
break;
}
}
/*
dictionary input end
*/
char message[252];
fgets(message, 252, stdin);
message[strlen(message) - 1] = 0;
char ** decoded_strings = (char **)malloc(27);
int k;
int match_count[27];
int max = 0;
int max_words = 0;
int index = 0;
for(k=0; k<27; k++)
{
decoded_strings[k] = (char *)malloc(251);
decoded_strings[k] = shift(message,k);
match_count[k] = countWords(dictionary,decoded_strings[k]);
if(match_count[k]>max)
{
max = match_count[k];
max_words = 1;
index = k;
}
else if(match_count[k] == max)
{
max_words++;
}
}
if(max_words>1)
{
int i;
int maxlen = 0;
int ndex = 0;
for(i=0; i<27; i++)
{
if(match_count[i] == max)
{
int len = strlen(decoded_strings[i]);
if(len>maxlen)
{
maxlen = len;
ndex = i;
}
}
}
printf("%s\n",decoded_strings[ndex]);
}
else if(max_words == 1)
{
printf("%s\n",decoded_strings[index]);
}
/*
printf("Dictionary:\n");
for(i=0; dictionary[i]; i++)
{
printf("%s\n",dictionary[i]);
}
printf("Decoded strings:\n");
for(k=0; k<27; k++)
{
printf("%d %s %d\n",k,decoded_strings[k], countWords(dictionary,decoded_strings[k]));
}*/
//printf("Safe\n");
/*
end
*/
/*
free
*/
// free dictionary
for(i=0; dictionary[i]; i++)
{
free(dictionary[i]);
}
free(dictionary);
//printf("Freed dictionary\n");
//free decoded strings
for(i=0; decoded_strings[i]; i++)
{
free(decoded_strings[i]);
}
//printf("Freed decoded words\n");
//free(decoded_strings);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCiNkZWZpbmUgU0FGRSBwcmludGYoIlNhZmVcbiIpOwpjaGFyICogc2hpZnQoY2hhciAqIHN0ciwgaW50IGspCnsKICAgIGNoYXIgKiBkZWNvZGVkID0gKGNoYXIgKiltYWxsb2MoMjUxKTsKICAgIGludCBpOwogICAgc3RyY3B5KGRlY29kZWQsIHN0cik7CgogICAgZm9yKGk9MDsgZGVjb2RlZFtpXTsgaSsrKQogICAgewogICAgICAgIGludCBudW07CiAgICAgICAgaWYoaXNhbHBoYShkZWNvZGVkW2ldKSkKICAgICAgICB7CiAgICAgICAgICAgIG51bSA9IGRlY29kZWRbaV0gLSAnQScgKyAxOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBudW0gPSAwOwogICAgICAgIH0KCiAgICAgICAgbnVtKz1rOwogICAgICAgIGlmKG51bT4yNikKICAgICAgICAgICAgbnVtLT0yNzsKCiAgICAgICAgaWYoIW51bSkKICAgICAgICB7CiAgICAgICAgICAgIGRlY29kZWRbaV0gPSAnICc7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGRlY29kZWRbaV0gID0gbnVtICsgJ0EnIC0gMTsKICAgICAgICB9CgoKICAgIH0KICAgIGRlY29kZWRbaV0gPSAwOwoKICAgIHJldHVybiBkZWNvZGVkOwp9CgppbnQgY291bnRXb3JkcyhjaGFyICoqIGRpY3Rpb25hcnksIGNoYXIgKnN0cikKewogICAgaW50IGNvdW50ID0gMDsKICAgIGNoYXIgd29yZFsyMV07CgogICAgRklMRSAqIHN0cmVhbSA9IGZtZW1vcGVuKHN0cixzdHJsZW4oc3RyKSwiciIpOwoKICAgIHdoaWxlKGZzY2FuZihzdHJlYW0sICIlcyIsd29yZCk+MCkKICAgIHsKCiAgICAgICAgaW50IGkgPSAwOwogICAgICAgIGZvcihpOyBkaWN0aW9uYXJ5W2ldOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpZighc3RyY21wKHdvcmQsZGljdGlvbmFyeVtpXSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIlcyBtYXRjaGVzICVzIGluIHRoZSBkaWN0aW9uYXJ5IVxuIix3b3JkLGRpY3Rpb25hcnlbaV0pOwogICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9wcmludGYoIiVzIGRvZXMgbm90IG1hdGNoICVzIGluIHRoZSBkaWN0aW9uYXJ5XG4iLHdvcmQsZGljdGlvbmFyeVtpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmY2xvc2Uoc3RyZWFtKTsKICAgIHJldHVybiBjb3VudDsKfQoKaW50IG1haW4oKQp7CiAgICBjaGFyICAqKiBkaWN0aW9uYXJ5ID0gKGNoYXIgKiopbWFsbG9jKDEwMCk7CiAgICBtZW1zZXQoZGljdGlvbmFyeSwwLDEwMCk7CiAgICBpbnQgaSA9IDA7CiAgICB3aGlsZSgxKQogICAgewogICAgICAgIGNoYXIgKiB3b3JkID0gKGNoYXIgKiltYWxsb2MoMjIpOwogICAgICAgIC8vc2NhbmYoIiVzIix3b3JkKTsKICAgICAgICBmZ2V0cyh3b3JkLCAyMiwgc3RkaW4pOwogICAgICAgIHdvcmRbc3RybGVuKHdvcmQpLTFdID0gMDsKICAgICAgICBpZihzdHJjbXAod29yZCwiIyIpKQogICAgICAgIHsKICAgICAgICAgICAgZGljdGlvbmFyeVtpXSA9IHdvcmQ7CiAgICAgICAgICAgIGkrKzsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8qCgogICAgZGljdGlvbmFyeSBpbnB1dCBlbmQKCiAgICAqLwoKICAgIGNoYXIgbWVzc2FnZVsyNTJdOwogICAgZmdldHMobWVzc2FnZSwgMjUyLCBzdGRpbik7CiAgICBtZXNzYWdlW3N0cmxlbihtZXNzYWdlKSAtIDFdID0gMDsKCiAgICBjaGFyICoqIGRlY29kZWRfc3RyaW5ncyA9IChjaGFyICoqKW1hbGxvYygyNyk7CiAgICBpbnQgazsKCiAgICBpbnQgbWF0Y2hfY291bnRbMjddOwoKICAgIGludCBtYXggPSAwOwogICAgaW50IG1heF93b3JkcyA9IDA7CiAgICBpbnQgaW5kZXggPSAwOwogICAgZm9yKGs9MDsgazwyNzsgaysrKQogICAgewogICAgICAgIGRlY29kZWRfc3RyaW5nc1trXSA9IChjaGFyICopbWFsbG9jKDI1MSk7CiAgICAgICAgZGVjb2RlZF9zdHJpbmdzW2tdID0gc2hpZnQobWVzc2FnZSxrKTsKICAgICAgICBtYXRjaF9jb3VudFtrXSA9IGNvdW50V29yZHMoZGljdGlvbmFyeSxkZWNvZGVkX3N0cmluZ3Nba10pOwoKICAgICAgICBpZihtYXRjaF9jb3VudFtrXT5tYXgpCiAgICAgICAgewogICAgICAgICAgICBtYXggPSBtYXRjaF9jb3VudFtrXTsKICAgICAgICAgICAgbWF4X3dvcmRzID0gMTsKICAgICAgICAgICAgaW5kZXggPSBrOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKG1hdGNoX2NvdW50W2tdID09IG1heCkKICAgICAgICB7CiAgICAgICAgICAgIG1heF93b3JkcysrOwogICAgICAgIH0KICAgIH0KCgoKICAgIGlmKG1heF93b3Jkcz4xKQogICAgewogICAgICAgIGludCBpOwogICAgICAgIGludCBtYXhsZW4gPSAwOwogICAgICAgIGludCBuZGV4ID0gMDsKICAgICAgICBmb3IoaT0wOyBpPDI3OyBpKyspCiAgICAgICAgewoKICAgICAgICAgICAgaWYobWF0Y2hfY291bnRbaV0gPT0gbWF4KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgbGVuID0gc3RybGVuKGRlY29kZWRfc3RyaW5nc1tpXSk7CiAgICAgICAgICAgICAgICBpZihsZW4+bWF4bGVuKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG1heGxlbiA9IGxlbjsKICAgICAgICAgICAgICAgICAgICBuZGV4ID0gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHJpbnRmKCIlc1xuIixkZWNvZGVkX3N0cmluZ3NbbmRleF0pOwogICAgfQogICAgZWxzZSBpZihtYXhfd29yZHMgPT0gMSkKICAgIHsKICAgICAgICBwcmludGYoIiVzXG4iLGRlY29kZWRfc3RyaW5nc1tpbmRleF0pOwogICAgfQogICAgLyoKICAgIHByaW50ZigiRGljdGlvbmFyeTpcbiIpOwogICAgZm9yKGk9MDsgZGljdGlvbmFyeVtpXTsgaSsrKQogICAgewogICAgICAgIHByaW50ZigiJXNcbiIsZGljdGlvbmFyeVtpXSk7CiAgICB9CgogICAgcHJpbnRmKCJEZWNvZGVkIHN0cmluZ3M6XG4iKTsKICAgIGZvcihrPTA7IGs8Mjc7IGsrKykKICAgIHsKICAgICAgICBwcmludGYoIiVkICVzICVkXG4iLGssZGVjb2RlZF9zdHJpbmdzW2tdLCBjb3VudFdvcmRzKGRpY3Rpb25hcnksZGVjb2RlZF9zdHJpbmdzW2tdKSk7CiAgICB9Ki8KCgoKICAgIC8vcHJpbnRmKCJTYWZlXG4iKTsKCiAgICAvKgoKICAgIGVuZAoKICAgICovCgoKICAgIC8qCiAgICAgICAgZnJlZQogICAgKi8KCiAgICAvLyBmcmVlIGRpY3Rpb25hcnkKICAgIGZvcihpPTA7IGRpY3Rpb25hcnlbaV07IGkrKykKICAgIHsKICAgICAgICBmcmVlKGRpY3Rpb25hcnlbaV0pOwogICAgfQogICAgZnJlZShkaWN0aW9uYXJ5KTsKICAgIC8vcHJpbnRmKCJGcmVlZCBkaWN0aW9uYXJ5XG4iKTsKICAgIC8vZnJlZSBkZWNvZGVkIHN0cmluZ3MKCiAgICBmb3IoaT0wOyBkZWNvZGVkX3N0cmluZ3NbaV07IGkrKykKICAgIHsKICAgICAgICBmcmVlKGRlY29kZWRfc3RyaW5nc1tpXSk7CiAgICB9CiAgICAvL3ByaW50ZigiRnJlZWQgZGVjb2RlZCB3b3Jkc1xuIik7CiAgICAvL2ZyZWUoZGVjb2RlZF9zdHJpbmdzKTsKICAgIHJldHVybiAwOwp9Cg==