diff --git a/3433. Count Mentions Per User b/3433. Count Mentions Per User new file mode 100644 index 0000000..ee1f11d --- /dev/null +++ b/3433. Count Mentions Per User @@ -0,0 +1,57 @@ +#include +using namespace std; + +class Solution { +public: + vector countMentions(int numberOfUsers, vector>& events) { + map>> byTime; + for (auto &ev : events) { + int t = stoi(ev[1]); + byTime[t].push_back(ev); + } + + vector mentions(numberOfUsers, 0); + vector isOnline(numberOfUsers, true); + vector offlineUntil(numberOfUsers, 0); + + for (auto &entry : byTime) { + int t = entry.first; + auto &evs = entry.second; + + for (int i = 0; i < numberOfUsers; ++i) { + if (!isOnline[i] && offlineUntil[i] <= t) { + isOnline[i] = true; + offlineUntil[i] = 0; + } + } + + for (auto &ev : evs) { + if (ev[0] == "OFFLINE") { + int id = stoi(ev[2]); + isOnline[id] = false; + offlineUntil[id] = t + 60; + } + } + + for (auto &ev : evs) { + if (ev[0] != "MESSAGE") continue; + string mentionsStr = ev[2]; + string token; + stringstream ss(mentionsStr); + while (ss >> token) { + if (token == "ALL") { + for (int i = 0; i < numberOfUsers; ++i) mentions[i]++; + } else if (token == "HERE") { + for (int i = 0; i < numberOfUsers; ++i) + if (isOnline[i]) mentions[i]++; + } else if (token.rfind("id", 0) == 0) { + int id = stoi(token.substr(2)); + if (0 <= id && id < numberOfUsers) mentions[id]++; + } + } + } + } + + return mentions; + } +};