Cod sursa(job #2439139)

Utilizator bluestorm57Vasile T bluestorm57 Data 15 iulie 2019 10:19:02
Problema Trie Scor 100
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <bits/stdc++.h>

using namespace std;

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

struct Trie{
    int nr,nrfii;
    Trie *fiu[26];
    Trie(){
        nr = nrfii = 0;
        memset( fiu, 0, sizeof( fiu ) );
    }
};

Trie *T = new Trie;
string s;
int n;

void ins(Trie *node, int p){
    if(p == n)
        node -> nr++;
    else{
        if(node -> fiu[s[p] - 'a'] == 0){
            node -> nrfii++;
            node -> fiu[s[p] - 'a'] = new Trie;
        }
        ins(node -> fiu[s[p] - 'a'], p + 1);
    }
}

bool del(Trie *node, int p){
    if(p == n)
        node -> nr--;
    else
        if(del(node -> fiu[s[p] - 'a'], p + 1)){
            node -> fiu[s[p] - 'a'] = 0;
            node -> nrfii--;
        }
    if(node != T && node -> nrfii == 0 && node -> nr == 0){
        delete node;
        return 1;
    }
    return 0;
}

int see(Trie *node, int p){
    if(p == n)
        return node -> nr;
    if(node -> fiu[s[p] - 'a'] == 0)
        return 0;
    return see(node -> fiu[s[p] - 'a'], p + 1);
}

int prefix(Trie *node, int p){
    if(p == n || node -> fiu[s[p] - 'a'] == 0)
        return p;
    return prefix(node -> fiu[s[p] - 'a'], p + 1);
}

int main(){
    int type;
    while(f >> type >> s){
        n = s.size();
        switch(type){
            case 0:{
                ins(T, 0);
                break;
            }
            case 1:{
                del(T, 0);
                break;
            }
            case 2:{
                g << see(T, 0) << "\n";
                break;
            }
            case 3:{
                g << prefix(T,0) << "\n";
                break;
            }
        }
    }

    return 0;
}