Cod sursa(job #2579293)

Utilizator vxpsnVictor Pusnei vxpsn Data 12 martie 2020 12:30:56
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.36 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

class Node {
public:
    int val, cnt;
    Node *nxt[26];
    Node() {
        val = cnt = 0;
        memset(nxt, 0, sizeof(nxt));
    }
};

class Trie {
public:
    Node *root;
    Trie() {
        root = new Node();
    }
    void Insert(string s) {
        Node *curr = root;
        for(int i = 0; i < s.size(); ++i) {
            char c = s[i] - 'a';
            if(curr->nxt[c] == 0) {
                ++curr->cnt;
                curr->nxt[c] = new Node();
            }
            curr = curr->nxt[c];
            if(i == s.size() - 1) {
                ++curr->val;
            }
        }
    }
    void Delete(string s) {
        Node *curr = root;
        Node *arr[30];
        arr[0] = root;
        for(int i = 0; i < s.size(); ++i) {
            char c = s[i] - 'a';
            curr = curr->nxt[c];
            arr[i + 1] = curr;
        }
        for(int i = s.size() - 1; i >= 0; --i) {
            Node *curr = arr[i + 1];
            if(curr->cnt == 0 && curr->val <= 1) {
                --arr[i]->cnt;
                arr[i]->nxt[s[i] - 'a'] = 0;
                delete curr;
            }
        }
    }
    int CntAp(string s) {
        Node *curr = root;
        for(int i = 0; i < s.size(); ++i) {
            char c = s[i] - 'a';
            curr = curr->nxt[c];
            if(i == s.size() - 1) {
                return curr->val;
            }
        }
        return 0;
    }
    int Prefix(string s) {
        int best = 0;
        Node *curr = root;
        for(int i = 0; i < s.size(); ++i) {
            char c = s[i] - 'a';
            if(curr->nxt[c] == 0) break;
            curr = curr->nxt[c];
            best = max(best, i + 1);
            if(i == s.size() - 1 && curr->val > 1) {
                return (int)s.size();
            }
        }
        return best;
    }
};

int main() {
    int op;
    Trie trie;
    while(fin >> op) {
        string s;
        fin >> s;
        if(op == 0) {
            trie.Insert(s);
        }
        if(op == 1) {
            trie.Delete(s);
        }
        if(op == 2) {
            fout << trie.CntAp(s) << "\n";
        }
        if(op == 3) {
            fout << trie.Prefix(s) << "\n";
        }
    }
    return 0;
}