Cod sursa(job #2844734)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 5 februarie 2022 11:48:22
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <bits/stdc++.h>

using namespace std;
const long long NR = 1e6 + 10;
const long long MOD = 1LL << 32;


struct node {
    node *chr[26]{};
    int token;

    node() {
        for (auto &i : chr) {
            i = nullptr;
        }
        token = 0;
    }
} *root;

string s;

void add() {
    node *curr = root;
    for (char i : s) {
        if (curr->chr[i - 'a'] == nullptr) {
            curr->chr[i - 'a'] = new node;
        }
        curr = curr->chr[i - 'a'];
    }
    ++curr->token;
}

bool sub(node *curr, int pos) {
    if (pos == s.size()) {
        --curr->token;
    } else {
        if (sub(curr->chr[s[pos] - 'a'], pos + 1)) {
            curr->chr[s[pos] - 'a'] = nullptr;
            delete curr->chr[s[pos] - 'a'];
        }
    }
    bool ret = true;
    for (auto &i : curr->chr) {
        ret &= i == nullptr;
    }
    if (curr->token) {
        ret = false;
    }
    return ret;
}

int count() {
    node *curr = root;
    for (int i = 0; i < s.size(); ++i) {
        if (curr->chr[s[i] - 'a'] == nullptr)
            return 0;
        curr = curr->chr[s[i] - 'a'];
    }
    return curr->token;
}

int len() {
    node *curr = root;
    for (int i = 0; i < s.size(); ++i) {
        if (curr->chr[s[i] - 'a'] == nullptr)
            return i;
        curr = curr->chr[s[i] - 'a'];
    }
    return s.size();
}


int op;
ifstream in("trie.in");
ofstream out("trie.out");

signed main() {
    ios::sync_with_stdio(0);
    in.tie(0);
    root = new node();
    while (in >> op >> s) {
        if (op == 0) {
            add();
        }
        if (op == 1) {
            sub(root, 0);
        }
        if (op == 2) {
            out << count() << '\n';
        }
        if (op == 3) {
            out << len() << '\n';
        }
    }

    return 0;
}