Ranking (as of 2015-03-07): 12 out of 179
Language: C++
/* UVa 11860 - Document Analyzer To build using Visual Studio 2012: cl -EHsc -O2 UVa_11860_Document_Analyzer.cpp */ #include <string> #include <vector> #include <map> #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> using namespace std; const int nr_words_max = 100000; int positions[nr_words_max]; // positions[i] is the word number of i-th word int word_ctrs[nr_words_max]; // word_ctrs[i] is the number of word whose number is i int main() { int T; scanf("%d", &T); while (getchar() != '\n') ; for (int t = 1; t <= T; t++) { int nr_words = 0, nr_positions = 0; map<string, int> words; while (true) { const int nr_chars_max = 150; char s[nr_chars_max + 1]; gets(s); if (strstr(s, "END")) break; for (const char *ps = s, *qs = s; *ps; ) { while (*ps && !islower(*ps)) ps++; if (*ps) { qs = ps++; while (*ps && islower(*ps)) ps++; pair<map<string, int>::iterator, bool> result = words.insert(make_pair(string(qs, ps - qs), nr_words)); positions[nr_positions++] = result.first->second; if (result.second) word_ctrs[nr_words++] = 0; } } } int min_p = 0, min_q = nr_positions, nr = 0; for (int p = 0, q = 0; p < nr_positions && q <= nr_positions; ) { if (nr == nr_words) { if (q - p < min_q - min_p) min_p = p, min_q = q; if (!--word_ctrs[positions[p]]) nr--; p++; } else { if (q < nr_positions && !word_ctrs[positions[q]]++) nr++; q++; } } printf("Document %d: %d %d\n", t, min_p + 1, min_q); } return 0; }
No comments:
Post a Comment