Ranking (as of 2013-10-02): 425 out of 742
Language: C++
/* UVa 10393 - The One-Handed Typist To build using Visual Studio 2012: cl -EHsc -O2 UVa_10393_The_One_Handed_Typist.cpp */ #include <cstdio> #include <cstdlib> #include <cstring> const int nr_letters = 128; const char* keyboard_chars[] = {"", "qaz", "wsx", "edc", "rfvtgb", "", "", "yhnujm", "ik,", "ol.", "p;/"}; const int nr_chars_max = 63, n_max = 1000; struct word { int length_; char s_[nr_chars_max + 1]; } words[n_max]; int compare_word(const void* i, const void* j) { const word *wi = reinterpret_cast<const word*>(const_cast<void*>(i)), *wj = reinterpret_cast<const word*>(const_cast<void*>(j)); if (wi->length_ > wj->length_) return -1; else if (wi->length_ < wj->length_) return 1; else return strcmp(wi->s_, wj->s_); } int main() { bool letters[nr_letters]; // letters[i] is true if a letter i can be typed int i, j, f, n, m, mm, max_length; const char* p; while (scanf("%d %d", &f, &n) != EOF) { memset(letters, -1, sizeof(letters)); while (f--) { scanf("%d", &i); for (p = keyboard_chars[i]; *p; p++) letters[*p] = false; } m = mm = max_length = 0; while (n--) { scanf("%s", words[m].s_); for (p = words[m].s_; *p; p++) if (!letters[*p]) break; if (!*p && p - words[m].s_) { words[m].length_ = p - words[m].s_; if (words[m].length_ > max_length) { max_length = words[m].length_; mm = 1; } else if (words[m].length_ == max_length) mm++; m++; } } qsort(words, m, sizeof(word), compare_word); #ifdef DEBUG for (i = 0; i < m; i++) printf("%s%c", words[i].s_, ((i == m - 1) ? '\n' : ' ')); #endif for (i = 0, j = mm - 1; i < j; i++) // remove duplicated words if (!strcmp(words[i].s_, words[i + 1].s_)) { words[i].s_[0] = '\0'; mm--; } printf("%d\n", mm); for (i = 0, j = 0; j < mm; i++) if (words[i].s_[0]) { printf("%s\n", words[i].s_); j++; } } return 0; }
No comments:
Post a Comment