Cod sursa(job #2197061)

Utilizator alexilasiAlex Ilasi alexilasi Data 21 aprilie 2018 08:53:07
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>

#define CH (*s-'a')

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct trie
{
    int cnt,nrfii;
    trie *fiu[26];

    trie()
    {
        cnt=nrfii=0;
        memset(fiu,0,sizeof(fiu));
    }
};

trie *t = new trie;

void ins(trie *nod,char *s)
{
    if(*s=='\n')
    {
        nod->cnt++;
        return;
    }
    if(nod->fiu[CH]==0)
    {
        nod->fiu[CH]=new trie;
        nod->nrfii++;
    }
    ins(nod->fiu[CH],s+1);
}

int del(trie *nod,char *s)
{
    if(*s=='\n')
        nod->cnt--;
    else if(del(nod->fiu[CH],s+1))
    {
        nod->fiu[CH]=0;
        nod->nrfii--;
    }
    if(!nod->cnt&&!nod->nrfii&&nod!=t)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int que(trie *nod, char *s)
{
    if(*s=='\n')
        return nod->cnt;

    if(nod->fiu[CH])
        return que(nod->fiu[CH],s+1);
    return 0;
}

int pre(trie *nod,char *s,int k)
{
    if(*s=='\n'||nod->fiu[CH]==0)
        return k;
    return pre(nod->fiu[CH],s+1,k+1);
}

int x;
char c[100];

int main()
{
    while(fin>>x)
    {
        fin>>c;
        c[strlen(c)]='\n';
        if(x==0)
        {
            ins(t,c);
        }
        else if(x==1)
        {
            del(t,c);
        }
        else if(x==2)
        {
            fout<<que(t,c)<<'\n';
        }
        else if(x==3)
        {
            fout<<pre(t,c,0)<<'\n';
        }
    }
    return 0;
}