Cod sursa(job #2846621)

Utilizator BalasaRaduBalasa Radu BalasaRadu Data 9 februarie 2022 13:50:28
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <bits/stdc++.h>
using namespace std;

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

const int dim=1e5+9;

struct Trie{
    int cnt,nrfii;
    Trie *fiu[30];
    Trie(){
        cnt=nrfii=0;
        for(int i=0;i<=26;i++){
            fiu[i]=0;
        }
    }
};

Trie *root=new Trie;

void Insert(Trie *nod,char *s){
    char ch=*s;
    if(ch<'a'||ch>'z'){
        nod->cnt++;
        return;
    }
    else{
        ch-='a';
        if(nod->fiu[ch]==0){
            nod->fiu[ch]=new Trie;
            nod->nrfii++;
        }
        Insert(nod->fiu[ch],s+1);
    }
}

bool Delete(Trie *nod,char *s){
    char ch=*s;
    if(ch<'a'||ch>'z'){
        nod->cnt--;
    }
    else{
        ch-='a';
        if(Delete(nod->fiu[ch],s+1)){//daca am sters fiul ch
            nod->fiu[ch]=0;
            nod->nrfii--;
        }
    }
    if(nod->cnt==0&&nod->nrfii==0 && nod!=root){
        delete nod;
        return 1;
    }
    return 0;
}

int Query2(Trie *nod,char *s){
    int ch=*s;
    if(ch<'a'||ch>'z'){
        return nod->cnt;
    }
    ch-='a';
    if(nod->fiu[ch]){
        return Query2(nod->fiu[ch],s+1);
    }
    return 0;
}

int Query3(Trie *nod,char *s,int k){
    char ch=*s;
    if((ch<'a'||ch>'z')||nod->fiu[ch-'a']==0){
        return k;
    }
    ch-='a';
    return Query3(nod->fiu[ch],s+1,k+1);
}

signed main(){
    int op;
    while(fin>>op){
        char s[50];
        fin>>s;
        if(op==0){
            Insert(root,s);
        }
        if(op==1){
            Delete(root,s);
        }
        if(op==2){
            fout<<Query2(root,s)<<'\n';
        }
        if(op==3){
            fout<<Query3(root,s,0)<<'\n';
        }
    }
}