Untitled

mail@pastecode.io avatar
unknown
c_cpp
a year ago
1.8 kB
5
Indexable
Never
#include <vector>
#include <string>
#include <unordered_map>
#include <sstream>
#include <iostream>

using namespace std;

vector<int> getUnexpiredTokens(int time_to_live, const vector<string>& queries) {
    class TokenManager {
        unordered_map<string, int> tokens;  // stores token_id and its expiry time.
        int ttl;

    public:
        TokenManager(int time_to_live) : ttl(time_to_live) {}

        void generate(const string& token_id, int current_time) {
            tokens[token_id] = current_time + ttl;
        }

        void renew(const string& token_id, int current_time) {
            if(tokens.find(token_id) != tokens.end() && tokens[token_id] > current_time) {
                tokens[token_id] = current_time + ttl;
            }
        }

        int count(int current_time) {
            int count = 0;
            for(auto it = tokens.begin(); it != tokens.end();) {
                if(it->second <= current_time) {
                    it = tokens.erase(it);
                } else {
                    count++;
                    ++it;
                }
            }
            return count;
        }
    };

    TokenManager tm(time_to_live);
    vector<int> results;

    for(const string& query : queries) {
        stringstream ss(query);
        string type, token_id;
        int current_time;

        ss >> type;

        if(type == "generate") {
            ss >> token_id >> current_time;
            tm.generate(token_id, current_time);
        } else if(type == "renew") {
            ss >> token_id >> current_time;
            tm.renew(token_id, current_time);
        } else if(type == "count") {
            ss >> current_time;
            results.push_back(tm.count(current_time));
        }
    }
    return results;
}