Cod sursa(job #2436439)

Utilizator PaterucAPetruc Andrei Stefan PaterucA Data 5 iulie 2019 18:51:49
Problema Trie Scor 45
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{
    int c,t;
    nod *s[26];
    nod()
    {
        c=t=0;
        for(int i=0;i<26;i++)
            s[i]=NULL;
    }
};
int cod,lit[30];
nod *root,*elim[30];
char w[30];
void insereaza(),sterge(),numara(),prefix();
inline int decode(char ch){return (int)(ch-'a');}
int main()
{
    root = new nod;
    while(f>>cod)
    {
        f>>w;
        if(cod==0)insereaza();
        else if(cod==1)sterge();
        else if(cod==2)numara();
        else prefix();
    }
    return 0;
}
void insereaza()
{
    char *p;
    nod *q;
    for(p=w,q=root;*p;p++)
    {
        int i=decode(*p);
        if(!q->s[i])q->s[i]=new nod;
        q=q->s[i];
        q->t++;
    }
    q->c++;
}
void sterge()
{
    char *p;
    nod *q,*e;
    int top=0;
    for(p=w,q=root;*p;p++)
    {
        elim[++top]=q;
        int i=decode(*p);
        lit[top]=i;
        q=q->s[i];
        q->t--;
    }
    q->c--;
    for(;top;top--)
    {
        q=elim[top];
        int i=lit[top];
        e=q->s[i];
        if(e->c)return;
        q->s[i]=NULL;
        delete e;
    }
}
void numara()
{
    char *p;
    nod *q;
    for(p=w,q=root;*p;p++)
    {
        int i=decode(*p);
        if(!q->s[i]){g<<"0\n";return;};
        q=q->s[i];
    }
    g<<(q->c)<<'\n';
}
void prefix()
{
    char *p;
    nod *q;
    int lg=0;
    for(p=w,q=root;*p;p++)
    {
        int i=decode(*p);
        if(!q->s[i]){g<<lg<<'\n';return;}
        q=q->s[i];
        lg++;
    }
    g<<lg<<'\n';
}