Cod sursa(job #2436440)

Utilizator PaterucAPetruc Andrei Stefan PaterucA Data 5 iulie 2019 19:10:37
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 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;
nod *root;
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 i;
    for(p=w,q=root;*p;p++)
    {
        i=decode(*p);
        if(q->s[i]->t==1)
        {
            e=q->s[i];
            break;
        }
        q=q->s[i];
        q->t--;
    }
    if(*p==0){q->c--;return;}
    q->s[i]=0;
    do
    {
        p++;
        if(*p){i=decode(*p);q=e;e=e->s[i];delete q;}
        else delete e;

    }
    while(*p);
}
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';
}