Cod sursa(job #2579028)

Utilizator Senth30Denis-Florin Cringanu Senth30 Data 11 martie 2020 20:56:39
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 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 solDFS(int node){
    if(pos == lg){
        if(tip == 0) cnt[node]++, add[node]++;
        if(tip == 1) cnt[node]--, add[node]--;
        if(tip == 2) 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++;
            solDFS(neigh);
            if(tip == 3)
                ans++;
            if(node != 1){
                if(tip == 0) cnt[node]++;
                if(tip == 1) cnt[node]--;
            }
            return;
        }
    }
    if(tip == 3 || tip == 2) return;
    tree[node].push_back(N);
    ch[N] = s[pos];
    N++; pos++;
    solDFS(N - 1);
    if(node != 1){
        if(tip == 0) cnt[node]++;
        if(tip == 1) cnt[node]--;
    }
}

int main(){

    N = 2; ch[0] = '-';
    while(fin >> tip >> s){
        lg = strlen(s); pos = 0;
        solDFS(1);
        if(tip == 3 || tip == 2){
            fout << ans << '\n';
            ans = 0;
        }
    }


    return 0;
}