Cod sursa(job #2435993)

Utilizator AndreiStrAndrei Stroici AndreiStr Data 4 iulie 2019 14:57:58
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{
    nod *s[26];
    int pass,cuvinte;
    nod()
    {
        pass=cuvinte=0;
        for(int i=0;i<26;i++)
            s[i]=NULL;
    }
};
nod *root;
char w[25];
inline int decode(char ch){return (int)(ch-'a');}
void insertie(),stergere(),numara(),prefix();
int cod;
int main()
{
    root=new nod;
    while(f>>cod)
    {
        f>>w;
        if(cod==0)insertie();else
        if(cod==1)stergere();else
        if(cod==2)numara();else
        prefix();
    }
    return 0;
}
void insertie()
{
    int p=0;
    nod *q=root;
    for(;w[p];p++)
    {
        int c=decode(w[p]);
        if(!q->s[c])q->s[c]=new nod;
        q=q->s[c];
        q->pass++;
    }
    q->cuvinte++;
}
void stergere()
{
    int p=0;
    nod *q=root;
    vector<pair<nod*,int>> elim;
    for(;w[p];p++)
    {
        int c=decode(w[p]);
        if(q->s[c]->pass==1)elim.push_back(make_pair(q,c));
        q=q->s[c];
        q->pass--;
    }
    q->cuvinte--;
    while(elim.size())
    {
        int c;
        tie(q,c)=elim.back();
        elim.pop_back();
        nod *aux=q->s[c];
        q->s[c]=0;
        delete aux;
    }
}
void numara()
{
    int p=0;
    nod *q=root;
    for(;w[p];p++)
    {
        int c=decode(w[p]);
        if(!q->s[c]){g<<"0\n";return;}
        q=q->s[c];
    }
    g<<(q->cuvinte)<<'\n';
}
void prefix()
{
    int p=0,Lg=0;
    nod *q=root;
    for(;w[p];p++)
    {
        int c=decode(w[p]);
        if(!q->s[c])break;
        q=q->s[c];
        Lg++;
    }
    g<<Lg<<'\n';
}