Cod sursa(job #791505)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 24 septembrie 2012 13:45:06
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb

#include <cstdio>
#include <fstream>
#include <string>
#include <cstdlib>
#include <cstring>

using namespace std;

struct trie {
    int C,F;
    trie *f[26];
    trie(){
        C=F=0;
        memset(f,0,sizeof(f));
    }
};
trie *T= new trie;
string s;

void add (trie *nd,int i)
{
    if(i==s.size())
    {
        ++(nd->C);
        return;
    }
    if(nd->f[s[i]-'a']==0)
    {
        nd->f[s[i]-'a']=new trie;
        ++(nd->F);
    }
    add(nd->f[s[i]-'a'],i+1);
}

int del (trie *nd,int i)
{
    if(i==s.size())
        --(nd->C);
    else
        if(del(nd->f[s[i]-'a'],i+1))
        {
            nd->f[s[i]-'a']=0;
            --(nd->F);
        }
    if(nd->C==0&&nd->F==0&&nd!=T)
    {
        delete nd;
        return 1;
    }
    return 0;
}

int que (trie *nd,int i)
{
    if(i==s.size())
        return nd->C;
    if(nd->f[s[i]-'a'])
        return que(nd->f[s[i]-'a'],i+1);
    return 0;
}

int pre (trie *nd,int i,int c)
{
    if(i==s.size()||nd->f[s[i]-'a']==0)
        return c;
    return pre(nd->f[s[i]-'a'],i+1,c+1);
}

int main ()
{

    ifstream in ("trie.in");
    freopen ("trie.out","w",stdout);

    for(int t;in>>t>>s;)
    {
        if(t==0)
            add(T,0);
        if(t==1)
            del(T,0);
        if(t==2)
            printf("%d\n",que(T,0));
        if(t==3)
            printf("%d\n",pre(T,0,0));
    }

    return 0;

}