Cod sursa(job #2579057)

Utilizator Senth30Denis-Florin Cringanu Senth30 Data 11 martie 2020 21:38:02
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <bits/stdc++.h>
#define MOD 543217
#define INF 2100000000

using namespace std;
const int SMAX = 30;
const int NMAX = 120010;

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

int N, tip, lg, pos, ans;
int cnt[NMAX], add[NMAX];
int tree[27][NMAX];
char s[SMAX], ch[NMAX];

void add_element(int node){
    if(pos == lg){
        cnt[node]++;
        add[node]++;
        return;
    }
    if(tree[s[pos] - 'a' + 1][node]){
        pos++;
        add_element(tree[s[pos - 1] - 'a' + 1][node]);
        if(node != 1)
            cnt[node]++;
        return;
    }
    tree[s[pos] - 'a' + 1][node] = N;
    N++; pos++;
    add_element(N - 1);
    if(node != 1)
        cnt[node]++;
}

void del_element(int node){
    if(pos == lg){
        cnt[node]--;
        add[node]--;
        return;
    }
    if(tree[s[pos] - 'a' + 1][node] && cnt[tree[s[pos] - 'a' + 1][node]] > 0){
        pos++;
        del_element(tree[s[pos - 1] - 'a' + 1][node]);
        if(node != 1)
            cnt[node]--;
    }
}

void find_element(int node){
    if(pos == lg){
        ans = add[node];
        return;
    }
    if(tree[s[pos] - 'a' + 1][node] && cnt[tree[s[pos] - 'a' + 1][node]] > 0){
        pos++;
        find_element(tree[s[pos - 1] - 'a' + 1][node]);
    }
}

void prefix_element(int node){
    if(pos == lg)
        return;
    if(tree[s[pos] - 'a' + 1][node] && cnt[tree[s[pos] - 'a' + 1][node]] > 0){
        pos++;
        prefix_element(tree[s[pos - 1] - 'a' + 1][node]);
        ans++;
    }
}

int main(){

    N = 2; ch[0] = '-';
    while(fin >> tip >> s){
        lg = strlen(s); pos = 0;
        if(tip == 0)
            add_element(1);
        else if(tip == 1)
            del_element(1);
        else if(tip == 2){
            find_element(1);
            fout << ans << '\n';
            ans = 0;
        } else {
            prefix_element(1);
            fout << ans << '\n';
            ans = 0;
        }
    }

    return 0;
}