> For the complete documentation index, see [llms.txt](https://hao-fu-1.gitbook.io/oj/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hao-fu-1.gitbook.io/oj/binarysearch/1348.-tweet-counts-per-frequency.md).

# 1348. Tweet Counts Per Frequency

https\://leetcode.com/problems/tweet-counts-per-frequency/

Implement the class `TweetCounts` that supports two methods:

1\. `recordTweet(string tweetName, int time)`

* Stores the `tweetName` at the recorded `time` (in **seconds**).

2\. `getTweetCountsPerFrequency(string freq, string tweetName, int startTime, int endTime)`

* Returns the total number of occurrences for the given `tweetName` per **minute**, **hour**, or **day** (depending on `freq`) starting from the `startTime` (in **seconds**) and ending at the `endTime` (in **seconds**).
* `freq` is always **minute***,* **hour** *or **day***, representing the time interval to get the total number of occurrences for the given `tweetName`.
* The first time interval always starts from the `startTime`, so the time intervals are `[startTime, startTime + delta*1>,  [startTime + delta*1, startTime + delta*2>, [startTime + delta*2, startTime + delta*3>, ... , [startTime + delta*i,`` `**`min`**`(startTime + delta*(i+1), endTime + 1)>` for some non-negative number `i` and `delta` (which depends on `freq`). &#x20;

**Example:**

```
Input
["TweetCounts","recordTweet","recordTweet","recordTweet","getTweetCountsPerFrequency","getTweetCountsPerFrequency","recordTweet","getTweetCountsPerFrequency"]
[[],["tweet3",0],["tweet3",60],["tweet3",10],["minute","tweet3",0,59],["minute","tweet3",0,60],["tweet3",120],["hour","tweet3",0,210]]

Output
[null,null,null,null,[2],[2,1],null,[4]]

Explanation
TweetCounts tweetCounts = new TweetCounts();
tweetCounts.recordTweet("tweet3", 0);
tweetCounts.recordTweet("tweet3", 60);
tweetCounts.recordTweet("tweet3", 10);                             // All tweets correspond to "tweet3" with recorded times at 0, 10 and 60.
tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 0, 59); // return [2]. The frequency is per minute (60 seconds), so there is one interval of time: 1) [0, 60> - > 2 tweets.
tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 0, 60); // return [2, 1]. The frequency is per minute (60 seconds), so there are two intervals of time: 1) [0, 60> - > 2 tweets, and 2) [60,61> - > 1 tweet.
tweetCounts.recordTweet("tweet3", 120);                            // All tweets correspond to "tweet3" with recorded times at 0, 10, 60 and 120.
tweetCounts.getTweetCountsPerFrequency("hour", "tweet3", 0, 210);  // return [4]. The frequency is per hour (3600 seconds), so there is one interval of time: 1) [0, 211> - > 4 tweets.
```

**Constraints:**

* There will be at most `10000` operations considering both `recordTweet` and `getTweetCountsPerFrequency`.
* `0 <= time, startTime, endTime <= 10^9`
* `0 <= endTime - startTime <= 10^4`

实现两个api，recordTweet(string tweetName, int time)记录在什么时刻(单位s)有什么tweet，getTweetCountsPerFrequency(string freq, string tweetName, int startTime, int endTime)统计对于给定tweet，从startTime到endTime内以分或小时或天为间隔，出现的次数。time-based的遍历=>tree map。对于每个词维护一个的treemap，并在查询时根据interval划分出buckets，再从startTime开始遍历tree map并根据当前时间更新对应的bucket里的频率，直到超过endTime。

```cpp
class TweetCounts {
public:
    TweetCounts() {}
    
    unordered_map<string, map<int, int>> m;
    void recordTweet(string tweetName, int time) {
        ++m[tweetName][time];
    }
    
    vector<int> getTweetCountsPerFrequency(string freq, string tweetName, int startTime, int endTime) {
        if (!m.count(tweetName)) return vector<int>();
        int delta = 60;
        if (freq[0] == 'h') delta = 3600;
        else if (freq[0] == 'd') delta = 86400;
        vector<int> res((endTime - startTime) / delta + 1);
        const auto &tm = m[tweetName];
        for (auto i = tm.lower_bound(startTime); i != tm.end() && i->first <= endTime; ++i) {
            res[(i->first - startTime) / delta] += i->second;
        }
        return res;
    }
};

/**
 * Your TweetCounts object will be instantiated and called as such:
 * TweetCounts* obj = new TweetCounts();
 * obj->recordTweet(tweetName,time);
 * vector<int> param_2 = obj->getTweetCountsPerFrequency(freq,tweetName,startTime,endTime);
 */
```
