Cod sursa(job #2169588)

Utilizator caprariuapCaprariu Alin-Paul caprariuap Data 14 martie 2018 16:14:08
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#define pu(x) ((x^(x-1))&x)

using namespace std;

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

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

trie *rad = new trie();

void adauga(char *cuv, trie *p)
{
    if (cuv[0]=='\0')
    {
        p->ap++;
        p->sf++;
        return;
    }
    p->ap++;
    if (!p->next[cuv[0]-'a'])
    {
        trie *nextt = new trie();
        p->next[cuv[0]-'a']=nextt;
    }
    adauga(cuv+1,p->next[cuv[0]-'a']);
}

void sterge(char *cuv, trie *p)
{
    if (cuv[0]=='\0')
    {
        p->ap--;
        p->sf--;
        return;
    }
    sterge(cuv+1, p->next[cuv[0]-'a']);
    if (p->next[cuv[0]-'a']->ap==0)
    {
        delete p->next[cuv[0]-'a'];
        p->next[cuv[0]-'a']=0;
    }
}

int nrap(char *cuv, trie *p)
{
    if (cuv[0]=='\0')
        return p->sf;
    return nrap(cuv+1,p->next[cuv[0]-'a']);
}

int lgp(char *cuv, trie *p)
{
    if (cuv[0]=='\0')
        return 0;
    if (!p->next[cuv[0]-'a'])
        return 0;
    return lgp(cuv+1,p->next[cuv[0]-'a'])+1;
}

int main()
{
    int op;
    char s[30];
    while (fin>>op)
    {
        fin >> s;
        if (op==0)
            adauga(s,rad);
        else if (op==1)
            sterge(s,rad);
        else
            if (op==2)
                fout << nrap(s,rad) << '\n';
            else
                fout << lgp(s,rad) << '\n';
    }
}