Cod sursa(job #2455961)

Utilizator EricEric Vilcu Eric Data 13 septembrie 2019 10:50:04
Problema Trie Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nd{int ap;nd*n[26];}*R=new nd;
char a[21];
int v=1,n;
void adap(int i,nd*T)
{
    if(i==n)
    {
        T->ap++;
    }
    else if(T->n[a[i]-'a']==NULL)
    {
        nd*K=new nd;
        K->ap=0;T->n[a[i]-'a']=K;
        for(int i=0;i<=25;++i)K->n[i]=NULL;
        adap(i+1,T->n[a[i]-'a']);
    }
    else adap(i+1,T->n[a[i]-'a']);
}
int reap(int i,nd*T)
{
    if(i==n)
    {
        T->ap--;
        if(T->ap<=0)
        {
            delete(T);return 1;
        }
        return 0;
    }
    else
    {
        int q=reap(i+1,T->n[a[i]-'a']);
        if(q==0)return q;
        else
        {
            q=0;T->n[a[i]-'a']=NULL;
            if(T->ap>0)return 0;
            for(int i=0;i<=25;++i)if(T->n[i]!=NULL)return 0;
            delete(T);return 1;
        }
    }
}
void cap(int i,nd*T)
{
    if(i==n)
    {
        g<<T->ap<<'\n';
    }
    else if(T->n[a[i]-'a']==NULL)
    {
        g<<0<<'\n';
    }
    else cap(i+1,T->n[a[i]-'a']);
}
int pap(int i,nd*T)
{
    if(i==n)
    {
        return i;
    }
    else if(T->n[a[i]-'a']==NULL)
    {
        return i;
    }
    else return pap(i+1,T->n[a[i]-'a']);
}
int main()
{
    for(int i=0;i<=25;++i)R->n[i]=NULL;
    while(f>>v)
    {
        f>>a;n=strlen(a);
        switch(v)
        {
            case 0:adap(0,R);break;
            case 1:reap(0,R);break;
            case 2:cap(0,R);break;
            case 3:g<<pap(0,R)<<'\n';break;
        }
    }
}