Cod sursa(job #2705615)

Utilizator 3DwArDPauliuc Edward 3DwArD Data 12 februarie 2021 23:49:24
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

#define T 26
using namespace std;
#define input f
#define output g
#define NMAX 10005
ifstream f("trie.in");
ofstream g("trie.out");

struct Nod {
    int next[T];
    int index = 0;
    int contains = 0;

    Nod(int idx = 0) {
        index = idx;
        fill(begin(next), end(next), -1);
    }
};

vector<Nod> trie(1);

void insert(string s) {
    int v = 0;
    for (int i = 0; i < s.size(); i++) {
        if (trie[v].next[s[i] - 'a'] == -1) {
            trie[v].next[s[i] - 'a'] = trie.size();
            trie.emplace_back(Nod());
        }
        v = trie[v].next[s[i] - 'a'];
        trie[v].contains ++;
    }
    trie[v].index++;
}

void remove(string s) {
    int v = 0;
    for (int i = 0; i < s.size(); i++) {
        v = trie[v].next[s[i] - 'a'];
        trie[v].contains --;
    }
    trie[v].index--;
}

int aparitii(string s) {
    int v = 0;
    for (int i = 0; i < s.size() && v != -1; i++) {
        v = trie[v].next[s[i] - 'a'];
    }

    return v == -1 ? 0 : trie[v].index;
}

int prefix(string s) {
    int v = 0;
    for (int i = 0; i < s.size(); i++) {
        if(trie[trie[v].next[s[i]-'a']].contains == 0)
            return i;

        v = trie[v].next[s[i] - 'a'];
    }
    return s.size();
}

int main() {
    int op;
    string s;
    while (input >> op >> s) {
        if (op == 0) {
            insert(s);
        } else if (op == 1) {
            remove(s);
        } else if (op == 2) {
            output << aparitii(s) << '\n';
        } else { //3
            output << prefix(s) << '\n';
        }
    }
}