// UVa 11860 - Document Analyzer #include <iostream> #include <queue> #include <string> #include <map> #include <vector> #include <climits> #include <set> using namespace std; struct par { string word; int pos; par(string w, int p) { word = w; pos = p; } }; bool operator <(par x, par y) { return x.pos > y.pos; } vector<string> words; priority_queue<par> q; map<string, int> rightmost; map<string, bool> repeated; int main() { int docs; cin >> docs; for (int doc = 1; doc <= docs; doc++) { words.clear(); string line; repeated.clear(); int m = 0; while (getline(cin, line) && line != "END") { string word = ""; for (int i = 0; i < line.length(); i++) if (line[i] >= 'a' && line[i] <= 'z') word += line[i]; else if (word.length() > 0) { words.push_back(word); if (!repeated[word]) { m++; repeated[word] = true; } word = ""; } if (word.length() > 0) { words.push_back(word); if (!repeated[word]) { m++; repeated[word] = true; } word = ""; } } int p = 0, sol = INT_MAX, seen = 0, n = words.size(); rightmost.clear(); q = priority_queue<par>(); for (int i = 1; i <= n; i++) { string word = words[i - 1]; if (rightmost[word] == 0) seen++; rightmost[word] = i; q.push(par(word, i)); while (!q.empty() && q.top().pos != rightmost[q.top().word]) q.pop(); if (seen == m && i - q.top().pos < sol) { sol = i - q.top().pos; p = q.top().pos; } } cout << "Document " << doc << ": " << p << " " << p + sol << endl; } }
Monday, May 4, 2015
UVa 11860 - Document Analyzer
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment