Cod sursa(job #2482487)

Utilizator Stefan_PiscuPiscu Stefan Constantin Stefan_Piscu Data 28 octombrie 2019 13:01:25
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>
using namespace std;

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

int x;
string s;

struct trie{
    trie* c[30];
    int nrf, nrc;
    trie(){
        nrc=nrf=0;
        for(int j=0;j<=27;j++){
            c[j]=0;
        }
    }
};

trie *node=new trie;

void baga(trie *nod, int ind){

    if(ind==s.size()) nod->nrc++;
    else{
        if(nod->c[s[ind]-'a']==0){
            nod->nrf++;
            nod->c[s[ind]-'a']=new trie;
        }
        baga(nod->c[s[ind]-'a'], ind+1);
    }
}

int cauta(trie *nod, int ind){
    if(ind==s.size()) return nod->nrc;
    else if(nod->c[s[ind]-'a']) return cauta(nod->c[s[ind]-'a'], ind+1);
          else return 0;
}

int cauta3(trie *nod, int ind){
    if(ind==s.size()||nod->c[s[ind]-'a']==0) return ind;
    return cauta3(nod->c[s[ind]-'a'], ind+1);
}

bool scoate(trie *nod, int ind){
    if(ind==s.size()) nod->nrc--;
    else{
        if(scoate(nod->c[s[ind]-'a'], ind+1)!=0){
            nod->c[s[ind]-'a']=0;
            nod->nrf--;
        }
    }
    if(nod!=node&&nod->nrf==0&&nod->nrc==0){
            delete nod;
            return 1;
    }
    return 0;
}

int main()
{
    while(fin>>x){
        fin>>s;
        if(x==0){
            baga(node, 0);
        }
        else if(x==1){
            scoate(node, 0);
        }
        else if(x==2){
            fout<<cauta(node, 0)<<"\n";
        }
        else{
            fout<<cauta3(node, 0)<<"\n";
        }
    }
    return 0;
}