Cod sursa(job #2843279)

Utilizator lflorin29Florin Laiu lflorin29 Data 2 februarie 2022 11:54:12
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <bits/stdc++.h>

using namespace std;

class Trie {

    struct TrieNode {
        map<char, unique_ptr<TrieNode> > nxt;
        int wordCnt;
        int prefixCnt;
        TrieNode() {
            wordCnt = 0;
            prefixCnt = 0;
        }
    };
    unique_ptr<TrieNode>root;
    /*/
    sau TrieNode *root;
    /*/

  public:
    Trie() {
        root = unique_ptr<TrieNode>(new TrieNode());
    }
    void modifyCnt(const string &s, int delta) {
        TrieNode *T = root.get();
        for(char c : s) {
            if(T->nxt.find(c) == end(T->nxt)) {
                T->nxt[c] = unique_ptr<TrieNode>(new TrieNode());
            }
            T = T->nxt[c].get();
            T->prefixCnt += delta;
        }
        T->wordCnt += delta;
    }
    int getCnt(const string &s) {
        TrieNode *T = root.get();
        for(char c : s) {
            if(T->nxt.find(c) == end(T->nxt)) {
                return 0;
            }
            T = T->nxt[c].get();
        }
        return T->wordCnt;
    }
    int getLCP(const string &s) {
        TrieNode *T = root.get();
        int len = 0;
        for(char c : s) {
            if(T->nxt.find(c) == end(T->nxt)) {
                return len;
            }
            T = T->nxt[c].get();
            if(T->prefixCnt == 0)
                return len;
            len++;
        }
        return len;
    }
};
int main() {
    ifstream cin("trie.in");
    ofstream cout("trie.out");

    string line;

    Trie T;
    while(getline(cin, line)) {
        string word = line.substr(2, line.size() - 2);
        //cerr << word << endl;
        if(line[0] == '0') {
            T.modifyCnt(word, 1);
        } else if(line[0] == '1') {
            T.modifyCnt(word, -1);
        } else if(line[0] == '2') {
            cout << T.getCnt(word) << '\n';
        }
        else cout << T.getLCP(word) << '\n';
    }
}