Cod sursa(job #1951569)

Utilizator matystroiaStroia Matei matystroia Data 3 aprilie 2017 18:19:59
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <cstring>
using namespace std;

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

struct nod
{
    int v, n;
    nod* nxt[26];

    nod()
    {
        v=n=0;
        memset(nxt, 0, sizeof(nxt));
    }
};

nod *r=new nod;

void ins(nod* x, char* s)
{
    int c=*s-'a';

    if(*s==0)
    {
        x->v++;
        return;
    }

    if(x->nxt[c]==0)
        x->nxt[c]=new nod, x->n++;

    ins(x->nxt[c], s+1);
}

bool del(nod* x, char* s)
{
    int c=*s-'a';

    if(*s==0)
        x->v--;
    else if(del(x->nxt[c], s+1))
        x->nxt[c]=0, x->n--;

    if(x->v==0&&x->n==0&&x!=r)
    {
        delete x;
        return true;
    }

    return 0;
}

int query(nod* x, char* s)
{
    int c=*s-'a';

    if(*s==0)
        return x->v;

    if(x->nxt[c])
        return query(x->nxt[c], s+1);

    return 0;
}

int len(nod* x, char* s, int l)
{
    int c=*s-'a';

    if(*s==0||x->nxt[c]==0)
        return l;

    return len(x->nxt[c], s+1, l+1);
}

int main()
{
    int op; char cuv[25];
    while(fin>>op>>cuv)
    {
        if(op==0)
            ins(r, cuv);
        else if(op==1)
            del(r, cuv);
        else if(op==2)
            fout<<query(r, cuv)<<'\n';
        else if(op==3)
            fout<<len(r, cuv, 0)<<'\n';
    }
    return 0;
}