Cod sursa(job #468738)

Utilizator APOCALYPTODragos APOCALYPTO Data 4 iulie 2010 20:31:40
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
using namespace std;
#include <cstring>
#include<fstream>
#include<cstdio>
#include<iostream>
int N;
struct nod{
 nod *next[26];
 int nrap,nrs;
 nod()
 {
     memset(next,0,sizeof(next));
     nrap=0;
     nrs=0;
 }
};
ofstream fout("trie.out");
char demo[50];
typedef nod* trie;
trie R=new nod;

void ins(trie &n, int p)
{   if(p==N)
       { n->nrap++;

        return;
       }

    if(n->next[demo[p]-'a']==NULL)  //-----------------------------------
    {
        n->next[demo[p]-'a']=new nod;
        n->nrs++;
    }

    ins(n->next[demo[p]-'a'],p+1);

}
int sterge(trie &n,int p)
{
    if(p==N)
    n->nrap--;
    else
    if(sterge(n->next[demo[p]-'a'],p+1))
    { n->nrs--;
    n->next[demo[p]-'a']=NULL;
    }
    if(n->nrs==0&&n->nrap==0&&n!=R)
    {
        delete n;
        return 1;
    }
    return 0;




}
int nrapar(trie &n,int p)
{
    if(p==N)
    return n->nrap;
    if(n->next[demo[p]-'a'])
     return nrapar(n->next[demo[p]-'a'],p+1);
    return 0;


}
int cauta(trie &n,int p,int k)
{
    if(p==N||n->next[demo[p]-'a']==NULL)
    return k;

    return cauta(n->next[demo[p]-'a'],p+1,k+1);
}
void cit()
{char x;
int dumm;
    ifstream fin("trie.in");
    while(fin>>dumm)
    {fin.get(demo,2);
    fin.getline(demo,50);

    N=strlen(demo);
    if(dumm==0) ins(R,0);

    if(dumm==1) sterge(R,0);
    if(dumm==2) fout<<nrapar(R,0)<<"\n";
    if(dumm==3) fout<<cauta(R,0,0)<<"\n";
    }


}
int main()
{
    cit();
    fout.close();
    return 0;
}