Cod sursa(job #1335730)

Utilizator emiemiEmi Necula emiemi Data 5 februarie 2015 20:35:37
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int tip;
char *p,sir[22];
struct trie{
    int nr;
    trie *fii[26];
    trie(){
        nr=0;
        memset(fii,0,sizeof(fii));
    }
};
trie *t;
inline void insereaza(trie *t,char *p)
{
    if(*p==0)
    {
        t->nr++;
        return ;
    }
    int l=*p-'a';
    if(t->fii[l]==NULL)
    t->fii[l]=new trie;
    insereaza(t->fii[l],p+1);
}
inline void sterge(trie *t,char *p)
{
    if(*p==0)
    {
        t->nr--;
        if(t->nr==0)
        delete t;
        return ;
    }
    int l=*p-'a';
    sterge(t->fii[l],p+1);
}
inline int nraparitii(trie *t,char *p)
{
    if(*p==0)
    return t->nr;
    int l=*p-'a';
    if(t->fii[l]==NULL)
    return 0;
    return nraparitii(t->fii[l],p+1);
}
inline int cmlprefix(trie *t,char *p)
{
    if(*p==0)
    return p-sir;
    int l=*p-'a';
    if(t->fii[l]==NULL)
    return p-sir;
    return cmlprefix(t->fii[l],p+1);
}
int main()
{
    t=new trie;
    while(f>>tip)
    {
        f>>sir;
        p=sir;
        if(tip==0)
        insereaza(t,p);
        if(tip==1)
        sterge(t,p);
        if(tip==2)
        g<<nraparitii(t,p)<<'\n';
        if(tip==3)
        g<<cmlprefix(t,p)<<'\n';
    }
    return 0;
}