Cod sursa(job #2095432)

Utilizator infomaxInfomax infomax Data 27 decembrie 2017 15:32:27
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>

#define chr *s-'a'

using namespace std;

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

struct trie
{
    int k, fiu;
    trie *v[30];
    trie()
    {
        k = fiu = 0;
        for(int i = 0; i < 26; ++ i) v[i] = 0;
    }
};

int x; char s[35]; trie *T = new trie;

void Ins(trie *nod, char *s)
{
    if(chr < 0) {nod->k++; return;}
    if(!(nod->v[chr]))
    {
        nod->v[chr] = new trie;
        nod->fiu++;
    }
    Ins(nod->v[chr], s+1);
}

int Del(trie *nod, char *s)
{
    if(chr < 0) nod->k--;
    else if(Del(nod->v[chr], s+1))
    {
        nod->v[chr] = 0;
        nod->fiu--;
    }
    if( !(nod->k) && nod != T && !(nod->fiu) ) {delete nod; return 1;}
    return 0;
}

int Ap(trie *nod, char *s)
{
    if(chr < 0) return nod->k;
    if(nod->v[chr]) return Ap(nod->v[chr], s+1);
    return 0;
}

int Pref(trie *nod, char *s, int ans)
{
    if(!(nod->v[chr]) || chr < 0) return ans;
    return Pref(nod->v[chr], s+1, ans+1);
}

int main()
{
    while(F >> x)
    {
        F.get();
        F.get(s, 22);
        if(!x) Ins(T, s);
        else if(x == 1) Del(T, s);
        else if(x == 2) G << Ap(T, s) << '\n';
        else G << Pref(T, s, 0) << '\n';
    }
    return 0;
}