Cod sursa(job #1818390)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 29 noiembrie 2016 10:15:47
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <cstring>
using namespace std;

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

int t;
char s[101];

struct nod{
    int val,nrf;
    char c;
    nod *v[26];
    nod *ant;
}*R;

int add(char s[],int val,nod *r)
{
    int n = strlen(s);
    nod *aux;
    for (int i=0;i<n;i++)
    {
        if (r->v[s[i]-'a']==NULL)
        {
            aux = new nod;
            aux->c = s[i];
            aux->ant = r;
            aux->val = 0;
            aux->nrf = 0;
            r->v[s[i]-'a'] = aux;
            r->nrf ++;
            r=aux;
        }
        else
            r=r->v[s[i]-'a'];
    }
    r->val += val;
    int sav = r->val;
    while (r->val == 0 && r->nrf == 0 && r!=R)
    {
        nod *aux = r->ant;
        aux->v[r->c-'a'] = NULL;
        delete r;
        r=aux;
        r->nrf--;
    }
    return sav;
}

int lgpref(char s[],nod *r)
{
    int nr=0;
    int n=strlen(s);
    for (int i=0;i<n;i++)
    {
        if (r->v[s[i]-'a']==NULL)
        {
            return nr;
        }
        nr++;
        r = r->v[s[i]-'a'];
    }
    return nr;
}

int main()
{
    R = new nod;
    while (f>>t)
    {
        f>>s;
        if (t==0)
        {
            add(s,1,R);
        }
        else if (t==1)
        {
            add(s,-1,R);
        }
        else if (t==2)
        {
            g<<add(s,0,R)<<'\n';
        }
        else
        {
            g<<lgpref(s,R)<<'\n';
        }
    }
    return 0;
}