Cod sursa(job #2436442)

Utilizator PaterucAPetruc Andrei Stefan PaterucA Data 5 iulie 2019 19:28:57
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 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(nod*,char*),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(root,w);
        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(nod *q,char *p)
{
    q->t--;
    if(*p==0){q->c--;return;}
    int i=decode(*p);
    sterge(q->s[i],p+1);
    nod *r=q->s[i];
    if(!r->t)
    {
        q->s[i]=NULL;
        delete r;
    }
}
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';
}