Cod sursa(job #2171432)

Utilizator patcasrarespatcas rares danut patcasrares Data 15 martie 2018 12:21:01
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<fstream>
#include<cmath>
#include<iomanip>
#include<algorithm>
#define DN 305
#define x first
#define y second
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int type;
char a[25];
struct trie
{
    int nra=0,nrc=0;
    trie *c[27]={0};
};
trie *t=new trie;
void inserare(trie *nod,char *p)
{
    if(*p==0)
    {
        nod->nra++;
        return;
    }
    if(nod->c[*p-'a']==0)
    {
        nod->nrc++;
        nod->c[*p-'a']=new trie;
    }
    inserare(nod->c[*p-'a'],p+1);
}
int del(trie *nod,char *p)
{
    if(*p==0)
        nod->nra--;
    else
        if(del(nod->c[*p-'a'],p+1))
        {
            nod->c[*p-'a']=0;
            nod->nrc--;
        }
    if(nod!=t&&nod->nrc==0&&nod->nra==0)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int nrap(trie *nod,char *p)
{
    if(*p==0)
        return nod->nra;
    if(nod->c[*p-'a'])
        return nrap(nod->c[*p-'a'],p+1);
    return 0;
}
int prefix(trie *nod,char *p,int r)
{
    if(*p==0||nod->c[*p-'a']==0)
        return r;
    return prefix(nod->c[*p-'a'],p+1,r+1);
}
int main()
{
    while(fin>>type>>a)
    {
        if(type==0)
            inserare(t,a);
        if(type==1)
            del(t,a);
        if(type==2)
            fout<<nrap(t,a)<<'\n';
        if(type==3)
            fout<<prefix(t,a,0)<<'\n';
    }
}