Cod sursa(job #1969591)

Utilizator caprariuapCaprariu Alin-Paul caprariuap Data 18 aprilie 2017 15:40:07
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <stack>
#include <iomanip>
#include <queue>
using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct nod
{
    nod *next[30];
    int sf,fii;
    nod()
    {
        sf=fii=0;
        for (int i=0; i<27; i++)
            next[i]=0;
    }
};

nod *rad=new nod;

void adauga(char *cuv)
{
    int poz=0;
    nod *p=rad;
    while (cuv[poz])
    {
        if (!p->next[cuv[poz]-'a'])
        {
            nod *n=new nod;
            p->next[cuv[poz]-'a']=n;
        }
        p->fii++;
        p=p->next[cuv[poz]-'a'];
        poz++;
    }
    p->sf++;
}

bool sterge(char *cuv, nod *p)
{
    if (!cuv[0])
    {
        p->sf--;
        if (!p->sf&&!p->fii)
            return 1;
        return 0;
    }
    if (sterge(cuv+1,p->next[cuv[0]-'a']))
    {
        p->next[cuv[0]-'a']=0;
        p->fii--;
        if (!p->sf&&!p->fii)
            return 1;
        return 0;
    }
    else
    {
        p->fii--;
        return 0;
    }
}

int nrap(char *cuv)
{
    int poz=0;
    nod *p=rad;
    while (cuv[poz])
    {
        if (!p->next[cuv[poz]-'a'])
            return 0;
        p=p->next[cuv[poz]-'a'];
        poz++;
    }
    return p->sf;
}

int lgprefix(char *cuv)
{
    int poz=0;
    nod *p=rad;
    while (cuv[poz])
    {
        if (!p->next[cuv[poz]-'a'])
            return poz;
        p=p->next[cuv[poz]-'a'];
        poz++;
    }
    return poz-1;
}

int main()
{
    int op;
    char cuvant[25];
    while (fin >> op)
    {
        fin >> cuvant;
        if (op==0)
        {
            adauga(cuvant);
            continue;
        }
        if (op==1)
        {
            sterge(cuvant,rad);
            continue;
        }
        if (op==2)
        {
            fout << nrap(cuvant) << '\n';
            continue;
        }
        fout << lgprefix(cuvant) << '\n';
    }
}