Cod sursa(job #2371558)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 6 martie 2019 18:20:35
Problema Trie Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <utility>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <queue>
#include <map>
#include <stack>
#define ll long long
#define lsb(x) (x & -x)

using namespace std;

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

struct Trie {
    int cnt, pref;
    Trie* son[27];

    Trie() {
        cnt = pref = 0;
        memset(son, NULL, sizeof(son));
    }
};

Trie* root;

void add(Trie* node, int pos, const string &s) {
    node -> pref ++;
    if(pos == s.size())
        node -> cnt ++;
    else {
        char c = s[pos] - 'a';
        if(node -> son[c] == NULL)
            node -> son[c] = new Trie();

        add(node -> son[c], pos + 1, s);
     }
}

void del(Trie* node, int pos, const string &s) {
    node -> pref --;
    if(pos == s.size())
        node -> cnt --;
    else {
        char c = s[pos] - 'a';
        del(node -> son[c], pos + 1, s);
    }
}

int query2(Trie* node, int pos, const string &s) {
    if(pos == s.size())
        return node -> cnt;

    char c = s[pos] - 'a';
    if(node -> son[c] == NULL)
        return 0;
    return query2(node -> son[c], pos + 1, s);
}

int query3(Trie* node, int pos, const string &s) {
    if(pos == s.size())
        return pos;

    char c = s[pos] - 'a';
    if(node -> son[c] == NULL)
        return pos;

    if(node -> son[c] -> pref == 0)
        return pos;
    return query3(node -> son[c], pos + 1, s);
}

int main() {

    root = new Trie();

    int type;
    string s;
    while(in >> type >> s) {
        if(type == 0)
            add(root, 0, s);
        if(type == 1)
            del(root, 0, s);
        if(type == 2)
            out << query2(root, 0, s) << "\n";
        if(type == 3)
            out << query3(root, 0, s) << "\n";
    }

    return 0;
}