Cod sursa(job #389604)

Utilizator freak93Adrian Budau freak93 Data 1 februarie 2010 21:39:57
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<cstdio>
#include<cstring>

using namespace std;

const char iname[]="trie.in";
const char oname[]="trie.out";

struct trie
{
    int v;
    trie *nodes[26];
    int sons;
    trie()
    {
        memset(nodes,0,sizeof(nodes));
        v=sons=0;
    }
} *root=new trie();

int n,i,j;

char s[34];

void insert(trie *nod,char *s)
{
    if(*s<'a'||*s>'z')
    {
        ++nod->v;
        return;
    }
    if(nod->nodes[*s-'a']==0)
        nod->nodes[*s-'a']=new trie(),++nod->sons;
    insert(nod->nodes[*s-'a'],s+1);
}

bool del(trie *nod,char *s)
{
    if(*s<'a'||*s>'z')
    {
        --nod->v;
    }
    else if(del(nod->nodes[*s-'a'],s+1))
    {
        nod->nodes[*s-'a']=0;
        --nod->sons;
    }
    if(nod->v==0&&nod->sons==0&&nod!=root)
    {
        delete nod;
        return true;
    }
    return false;
}

int query(trie *nod,char *s)
{
    if(*s<'a'||*s>'z')
        return nod->v;
    if(nod->nodes[*s-'a'])
        return query(nod->nodes[*s-'a'],s+1);
    return 0;
}

int lcp(trie *nod,char *s,int k)
{
    if(*s<'a'||*s>'z'||nod->nodes[*s-'a']==0)
        return k;
    return lcp(nod->nodes[*s-'a'],s+1,k+1);
}

int main()
{
    freopen(iname,"r",stdin);
    freopen(oname,"w",stdout);

    fgets(s,sizeof(s),stdin);
    while(!feof(stdin))
    {
        switch(s[0])
        {
            case '0':insert(root,s+2); break;
            case '1':del(root,s+2); break;
            case '2':printf("%d\n",query(root,s+2)); break;
            case '3':printf("%d\n",lcp(root,s+2,0)); break;
        }
        fgets(s,sizeof(s),stdin);
    }

    fclose(stdin);
    fclose(stdout);

    return 0;
}