Cod sursa(job #2466498)

Utilizator EricEric Vilcu Eric Data 2 octombrie 2019 13:30:07
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nd{int ap;nd*n[27];}*R=new nd;
char a[22];
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 j=0;j<=26;++j)K->n[j]=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)
        {
            for(int j=0;j<=26;++j)if(T->n[j]!=NULL)return 0;
            if(T!=R)delete(T);return 1;
        }
        return 0;
    }
    else if(T->n[a[i]-'a']!=NULL)
    {
        int q=reap(i+1,T->n[a[i]-'a']);
        if(q==0)return 0;
        else
        {
            q=0;T->n[a[i]-'a']=NULL;
            if(T->ap>0)return 0;
            for(int j=0;j<=26;++j)if(T->n[j]!=NULL)return 0;
            if(T!=R)delete(T);return 1;
        }
    }
    else return 0;
}
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;
        }
    }
}