Cod sursa(job #1146827)

Utilizator sorynsooSorin Soo sorynsoo Data 19 martie 2014 12:23:33
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
int x;
char v[30];
struct nod
{
    int nr,fii;
    nod *urm[30];
    nod()
    {
        int i;
        nr=fii=0;
        for(i=0; i<=26; i++)
            urm[i]=NULL;
    }
}*rad;
void baga(nod *p)
{
    int i, lit;
    for(i=0; v[i]!='\0'; i++)
    {
        lit=v[i]-'a';
        if(p->urm[lit]==NULL)
        {
            p->urm[lit]=new nod();
            p->fii++;
        }
        p=p->urm[lit];
    }
    p->nr++;
}
bool sterge(nod *p, int i)
{
    int lit;
    if(v[i]=='\0')
        p->nr--;
    else
    {
        lit=v[i]-'a';
        if(sterge(p->urm[lit],i+1))
        {
            --p->fii;
            p->urm[lit]=NULL;
        }
    }
    if(p->fii==0 && p->nr==0 && p!=rad)
    {
        delete p;
        return true;
    }
    return false;
}
int nrap(nod *p)
{
    int lit,i;
    for(i=0; v[i]!='\0'; i++)
    {
        lit=v[i]-'a';
        if(p->urm[lit]==NULL) return 0;
        else p=p->urm[lit];
    }
    return p->nr;
}
int nrprefix(nod *p)
{
    int lit,i;
    for(i=0; v[i]!='\0'; i++ )
    {
        lit=v[i]-'a';
        if(p->urm[lit]==NULL) return i;
        else p=p->urm[lit];
    }
    return strlen(v);
}
int main()
{
    rad = new nod;
    while(cin>>x>>v)
    {
        if(x==0)
            baga(rad);
        if(x==1)
            sterge(rad,0);
        if(x==2)
            cout<<nrap(rad)<<"\n";
        if(x==3)
            cout<<nrprefix(rad)<<"\n";
    }
}