forked from mpfeifer1/Kattis
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrendingtopic.cpp
89 lines (77 loc) · 1.84 KB
/
trendingtopic.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <bits/stdc++.h>
using namespace std;
bool cmp(pair<string,int> p1, pair<string,int> p2) {
if(p1.second == p2.second) {
return p1.first < p2.first;
}
return p1.second > p2.second;
}
void runquery(map<string,int> cnt, int top) {
map<int,vector<string>> rev;
for(auto i : cnt) {
rev[i.second].push_back(i.first);
}
auto it = prev(rev.end());
vector<pair<string,int>> res;
while(res.size() < top) {
for(auto j : it->second) {
res.push_back({j,it->first});
}
if(it == rev.begin()) break;
it--;
}
sort(res.begin(),res.end(),cmp);
for(auto i : res) {
cout << i.first << " " << i.second << endl;
}
}
int main() {
string s;
vector<vector<string>> days;
map<int,vector<int>> queries;
int currday = 0;
days.push_back({});
while(cin >> s) {
if(s == "<text>") {
days.push_back({});
currday++;
continue;
}
if(s == "</text>") {
continue;
}
if(s == "<top") {
int n;
cin >> n;
string g;
cin >> g;
queries[currday].push_back(n);
continue;
}
if(s.size() < 4) {
continue;
}
days[currday].push_back(s);
}
days.push_back({});
currday++;
map<string,int> cnt;
for(int i = 0; i < currday; i++) {
for(auto j : days[i]) {
cnt[j]++;
}
if(i >= 7) {
for(auto j : days[i-7]) {
cnt[j]--;
if(cnt[j] == 0) {
cnt.erase(j);
}
}
}
for(auto j : queries[i]) {
cout << "<top " << j << ">" << endl;
runquery(cnt,j);
cout << "</top>" << endl;
}
}
}