Cod sursa(job #1059443)

Utilizator dumitruandrDumitru Andreea dumitruandr Data 16 decembrie 2013 18:22:58
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef struct nod
{
    char i;
    unsigned short nr;
    nod * fiu[26];
    nod()
    {
        i=0;nr=0;
        memset(fiu,0,sizeof(fiu));
    }
} nod;
nod *nd=new nod;
void ins(nod *n, char *s)
{
    if(*s=='\0')
    {
        n->nr++;
        return;
    }
    if(n->fiu[*s-'a']==0)
    {
        n->fiu[*s-'a']=new nod;
        n->i++;
    }
    ins(n->fiu[*s-'a'],s+1);
}
int del(nod *n,char *s)
{
    if(*s=='\0')
        n->nr--;
    else if(del(n->fiu[ *s-'a' ], s+1))
    {
        n->fiu[*s-'a']=0;
        n->i--;
    }
    if(n->nr==0&&n->i==0&&n!=nd)
    {
        delete n;
        return 1;
    }
	return 0;
}
int nr(nod *n,char *s)
{
     if(*s=='\0')
     {
         return n->nr;
     }
     if(n->fiu[*s-'a'])
        return nr(n->fiu[*s-'a'],s+1);
     return 0;
}
int pre( nod *n, char *s, int k ) {
    if( *s == '\0' || n->fiu[ *s-'a' ] == 0 )
        return k;
    return pre( n->fiu[ *s-'a' ], s+1, k+1 );
}
char l[30];
int a;
int main()
{
    ifstream f("trie.in");
    ofstream g("trie.out");
    while(!f.eof())
    {
		f>>a>>l;
        switch(a)
        {
            case 0: ins(nd,l); break;
            case 1: del(nd,l);break;
            case 2: g<<nr(nd,l)<<'\n'; break;
            case 3: g<<pre(nd,l,0)<<'\n'; break;
        }
    }
    return 0;
}