Cod sursa(job #1453802)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 24 iunie 2015 18:36:23
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<fstream>
#include<string>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
string s;

struct Trie{

    int cnt,ap;
    Trie *fiu[30];

    Trie(){

        cnt = ap = 0;
        for(int i = 0; i < 26 ; ++i)
            fiu[i] = 0;
    }
};

Trie *trie = new Trie;

void ins(Trie *nod,int poz)
{

    if(s.size() == poz){
        nod->cnt++;
        return;
    }
    if(nod->fiu[s[poz]-'a'] == 0){
        nod->fiu[s[poz] - 'a'] = new Trie;
        nod->ap++;
    }

    ins(nod->fiu[s[poz]-'a'],poz + 1);
}

int del(Trie *nod,int poz)
{

    if(s.size() == poz)
        nod->cnt--;
    else if(del(nod->fiu[s[poz]-'a'],poz + 1)){
        nod->fiu[s[poz]-'a'] = 0;
        nod->ap--;
    }

    if(nod->cnt == 0 && nod->ap == 0 && nod != trie){
        delete nod;
        return 1;
    }
    return 0;
}

int q1(Trie *nod,int poz){

    if(s.size() == poz)
        return nod->cnt;
    if(nod->fiu[s[poz]-'a'])
        return q1(nod->fiu[s[poz]-'a'],poz + 1);
    return 0;

}

int q2(Trie *nod,int poz,int rez)
{

    if(s.size() == poz || nod->fiu[s[poz]-'a'] == 0)
        return rez;
    return q2(nod->fiu[s[poz]-'a'],poz + 1,rez + 1);
}

int main()
{

    int query;
    while(in>>query){
        in>>s;
        if(query == 0)
            ins(trie,0);
        else if(query == 1)
            del(trie,0);
        else if(query == 2)
            out<<q1(trie,0)<<"\n";
        else
            out<<q2(trie,0,0)<<"\n";
    }
    return 0;
}