Run Time: 0.000
Ranking (as of 2016-11-03): 133 out of 378
Language: C++
/*
UVa 554 - Caesar Cypher
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_554_Caesar_Cypher.cpp
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
const int nr_words_max = 100, nr_word_chars_max = 20,
nr_encrypted_chars_max = 250, nr_decrypted_chars_max = 60, K_max = 27;
char words[nr_words_max + 1][nr_word_chars_max + 1];
const char* pwords[nr_words_max + 1];
int compare_words(const void* s, const void* t)
{
const char** p = (const char**)s;
const char** q = (const char**)t;
return strcmp(*p, *q);
}
int main()
{
int nr_words = 0;
while (true) {
gets(words[nr_words]);
if (words[nr_words][0] == '#')
break;
pwords[nr_words] = &words[nr_words][0];
nr_words++;
}
qsort(pwords, nr_words, sizeof(char*), compare_words);
char s[nr_encrypted_chars_max + 1];
gets(s);
char t[nr_encrypted_chars_max + 1];
int max_nr_matches = 0, max_k;
char *p, *q, *r;
for (int k = 0; k < K_max; k++) {
for (p = s, q = t; *p; p++, q++) {
int i = (*p == ' ') ? k : (*p - 'A' + 1 + k) % K_max;
*q = (i) ? 'A' + i - 1 : ' ';
}
*q = '\0';
int nr_matches = 0;
for (p = t, q = t; ; ) {
while (*q && *q != ' ')
q++;
if (*q) {
*q = '\0';
if (bsearch(&p, pwords, nr_words, sizeof(char*), compare_words))
nr_matches++;
p = ++q;
}
else {
if (bsearch(&p, pwords, nr_words, sizeof(char*), compare_words))
nr_matches++;
break;
}
}
if (nr_matches > max_nr_matches)
max_nr_matches = nr_matches, max_k = k;
}
#ifdef DEBUG
printf("%d %d\n", max_nr_matches, max_k);
#endif
for (p = s, q = t; *p; p++, q++) {
int i = (*p == ' ') ? max_k : (*p - 'A' + 1 + max_k) % K_max;
*q = (i) ? 'A' + i - 1 : ' ';
}
#ifdef DEBUG
printf("%s\n", t);
#endif
for (p = t, q = t, r = t; ; ) {
while (*q && *q != ' ')
q++;
if (q - r > nr_decrypted_chars_max) {
char* pp = p;
while (pp > r && *(pp - 1) == ' ')
pp--;
*pp = '\0';
puts(r);
r = p;
}
if (*q)
p = ++q;
else {
char* pp = p;
while (pp > r && *(pp - 1) == ' ')
pp--;
*pp = '\0';
puts(r);
break;
}
}
return 0;
}
No comments:
Post a Comment