Cod sursa(job #2579038)

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

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

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

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

void add_element(int node){
    if(pos == lg){
        cnt[node]++;
        add[node]++;
        return;
    }
    for(int i = 0; i < tree[node].size(); i++){
        int neigh = tree[node][i];
        if(ch[neigh] == s[pos] && cnt[neigh]){
            pos++;
            add_element(neigh);
            if(node != 1)
                cnt[node]++;
            return;
        }
    }
    tree[node].push_back(N);
    ch[N] = s[pos];
    N++; pos++;
    add_element(N - 1);
    if(node != 1)
        cnt[node]++;
}

void del_element(int node){
    if(pos == lg){
        cnt[node]--;
        add[node]--;
        return;
    }
    for(int i = 0; i < tree[node].size(); i++){
        int neigh = tree[node][i];
        if(ch[neigh] == s[pos] && cnt[neigh]){
            pos++;
            del_element(neigh);
            if(node != 1)
                cnt[node]--;
            return;
        }
    }
}

void find_element(int node){
    if(pos == lg){
        ans = add[node];
        return;
    }
    for(int i = 0; i < tree[node].size(); i++){
        int neigh = tree[node][i];
        if(ch[neigh] == s[pos] && cnt[neigh]){
            pos++;
            find_element(neigh);
            return;
        }
    }
}

void prefix_element(int node){
    if(pos == lg)
        return;
    for(int i = 0; i < tree[node].size(); i++){
        int neigh = tree[node][i];
        if(ch[neigh] == s[pos] && cnt[neigh]){
            pos++;
            prefix_element(neigh);
            ans++;
            return;
        }
    }
}

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;
}