Cod sursa(job #3168492)

Utilizator Radu_MocanasuMocanasu Radu Radu_Mocanasu Data 12 noiembrie 2023 16:11:42
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
    int k,n;
    trie *f[26];
    trie(){
        k = n = 0;
        memset(f,0,sizeof f);
    }
};
trie *rad = new trie;
char ch[25];
void ins(trie *nod ,char *s){
    if(*s == '\0'){
        nod->k++;
        return;
    }
    int v = *s - 'a';
    if(nod->f[v] == 0){
        nod->f[v] = new trie;
        nod->n++;
    }
    ins(nod->f[v],s + 1);
}
int del(trie *nod, char *s){
    int v = *s - 'a';
    if(*s == '\0') nod->k--;
    else if(del(nod->f[v],s + 1)){
        nod->f[v] = 0;
        nod->n--;
    }
    if(nod->k == 0 && nod->n == 0 && nod != rad){
        delete nod;
        return 1;
    }
    return 0;
}
int nrap(trie *nod, char *s){
    if(*s == '\0') return nod->k;
    int v = *s - 'a';
    if(nod->f[v] != 0) return nrap(nod->f[v],s + 1);
    return 0;
}
int pre(trie *nod, char *s, int k){
    int v = *s - 'a';
    if(*s == '\0' || nod->f[v] == 0)
        return k;
    return pre(nod->f[v],s + 1,k + 1);
}

int main()
{
    while(fin.get(ch,25)){
        fin.get();
        if(ch[0] == '0') ins(rad,ch + 2);
        else if(ch[0] == '1') del(rad,ch + 2);
        else if(ch[0] == '2') fout << nrap(rad,ch + 2) << "\n";
        else fout << pre(rad,ch + 2,0) << "\n";
    }
    return 0;
}