Cod sursa(job #2680539)

Utilizator Iustin01Isciuc Iustin - Constantin Iustin01 Data 3 decembrie 2020 18:30:32
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>
using namespace std;

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

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


Trie * r;


void inserare(Trie *trie, int poz, string s){
    if(poz == s.size()){
        trie->nr++;
        return;
    }
    int x = s[poz] - 'a';
    if(trie->fiu[x] == NULL)
        trie->fiu[x] = new Trie, trie->cnt++;
    inserare(trie->fiu[x], poz + 1, s);
}


bool del(Trie *trie, int poz, string s){
    if(poz == s.size())
        trie->nr--;
    else{
        int x = s[poz] - 'a';
        if(del(trie->fiu[x], poz + 1, s))
            trie->fiu[x] = 0, trie->cnt--;
    }

    if(trie->cnt == 0 && trie->nr == 0 && trie != r)
        return 1;
    return 0;
}

int cautare(Trie *trie, int poz, string s){
    if(poz == s.size())
        return poz;
    int x = s[poz] - 'a';
    if(!trie->fiu[x])
        return poz;
    return cautare(trie->fiu[x] , poz + 1, s);
}

int cautares(Trie *trie, int poz, string s){
    if(poz == s.size())
        return trie->nr;
    int x = s[poz] - 'a';
    if(!trie->fiu[x])
        return 0;
    return cautares(trie->fiu[x], poz + 1, s);
}

int main(){
    int caz;
    string s;
    r = new Trie;
    while(in>>caz>>s){
        if(caz == 0)
            inserare(r, 0, s);
        else
            if(caz == 1)
                del(r, 0, s);
        else
            if(caz == 2)
                out<<cautares(r, 0, s)<<"\n";
        else
            out<<cautare(r, 0, s)<<"\n";
    }
}