Cod sursa(job #2249757)

Utilizator unknownpersonBidasca Carina Georgiana unknownperson Data 30 septembrie 2018 11:02:13
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");

struct nod
{
    int tr,ap;
    nod *s[26];
    nod()
    {
        tr=0;
        ap=0;
        for(int i=0;i<26;i++)s[i]=NULL;
    }
};
nod *rad,*nd[25];
int n,m,x[25],cod,prefix(),aparitii();
char w[25];
int main()
{
    rad = new nod;
    while(f>>cod)
    {
        f>>w;
        if(cod==3){g<<prefix()<<'\n';continue;}
        if(cod==2){g<<aparitii()<<'\n';continue;}
        nod *q=rad;
        for(m=0;w[m];m++)
        {

            x[m]=w[m]-'a';
            nd[m]=q;
            if(!q->s[x[m]])q->s[x[m]]=new nod;
            q=q->s[x[m]];
        }
        if(cod==0)
        {
            for(int i=1;i<m;i++)
                nd[i]->tr++;
            q->tr++;
            q->ap++;
            continue;
        }
        for(int i=0;i<m;i++)
                nd[i]->tr--;
            q->tr--;
            q->ap--;
        for(int i=m-1;i>=0;i--)
        {
            nod *aux=nd[i]->s[x[i]];
            if(aux->tr)
                break;
            nd[i]->s[x[i]]=NULL;
            delete aux;
        }
    }
    return 0;
}
int prefix()
{
    nod *q;
    int i,c=0;
    for(i=0,q=rad;w[i];i++)
    {
        if(!q->s[w[i]-'a'])
            return c;
        q=q->s[w[i]-'a'];
        c++;
    }
    return c;
}
int aparitii()
{
    nod *q;
    int i;
    for(i=0,q=rad;w[i];i++)
    {
        if(!q->s[w[i]-'a'])
            return 0;
        q=q->s[w[i]-'a'];
    }
    return q->ap;
}