Cod sursa(job #1356340)

Utilizator httpsLup Vasile https Data 23 februarie 2015 13:13:25
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>
using namespace std;

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

#define cout g
#define DA 26

struct nod
{
    int nr,nr_fii;
    nod *fii[DA];
    nod()
    {
        nr=nr_fii=0;
        for(int i=0; i<DA; ++i) fii[i]=0;
    }
};

nod *root,*p;
int tip;
char s[DA];

void add(char *c,nod *p)
{
    if(*c=='\0')
    {
        ++(p->nr);
        return;
    }
    int x=*c-'a';
    if((p->fii[x])==0)
    {
        (p->fii[x])=new nod;
        ++p->nr_fii;
    }
    add(c+1,p->fii[x]);
}
bool del(char *c,nod *p)
{
    int x=*c-'a';
    if(*c=='\0')  --(p->nr);
    else if(del(c+1,p->fii[x]))
    {
        --(p->nr_fii);
        p->fii[x]=0;
    }
    if((p->nr)==0 && (p->nr_fii)==0 && p!=root)
    {
        delete p;
        return 1;
    }
    return 0;
}
void find(char *c,nod*p)
{
    if(*c=='\0')
    {
        cout<<p->nr<<'\n';
        return;
    }
    int x=*c-'a';
    if(p->fii[x]==0)
    {
        cout<<"0\n";
        return;
    }
    find(c+1,p->fii[x]);
}
void pref(char *c,nod*p,int l)
{
    if(*c=='\0')
    {
        cout<<l<<'\n';
        return;
    }
    int x=*c-'a';
    if(p->fii[x]==0)
    {
        cout<<l<<'\n';
        return;
    }
    pref(c+1,p->fii[x],l+1);
}
int main()
{
    root=new nod;
    while(f>>tip)
    {
        f>>s;
        switch(tip)
        {
        case 0:
            add(s,root);
            break;
        case 1:
            del(s,root);
            break;
        case 2:
            find(s,root);
            break;
        case 3:
            pref(s,root,0);
            break;
        }
    }
    return 0;
}