Cod sursa(job #1754836)

Utilizator dnprxDan Pracsiu dnprx Data 8 septembrie 2016 19:49:36
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <bits/stdc++.h>

using namespace std;

char c[50];

struct Nod
{
    int nr, cnt;
    Nod *leg[26];
};

Nod *L;

void Init()
{
    int i;
    L = new Nod;
    L->nr = 0;
    L->cnt = 0;
    for(i = 0; i < 26; i++)
        L->leg[i] = NULL;
}

void InsCuv(const char c[])
{
    int i, j, k;
    Nod *p, *q;
    p = L;
    for(i = 0; c[i]; i++)
    {
        j = c[i] - 'a';
        if(p->leg[j] != NULL)
        {
            p = p->leg[j];
            p->cnt++;
        }
        else
        {
            q = new Nod;
            q->nr = 0;
            q->cnt = 1;
            for(k = 0; k < 26; k++)
                q->leg[k] = NULL;
            p->leg[j] = q;
            p = q;
        }
    }
    p->nr++;
    p->cnt++;
}

void Sterge(const char c[])
{
    int i, j;
    Nod *p;
    p = L;
    for(i = 0; c[i]; i++)
    {
        j = c[i] - 'a';
        p = p->leg[j];
        p->cnt--;
    }
    p->nr--;
    p->cnt--;
}

int NrAp(const char c[])
{
    int i, j;
    Nod *p;
    p = L;
    for(i = 0; c[i] != 0; i++)
    {
        j = c[i] - 'a';
        if(p -> leg[j] == NULL)
            return 0;
        p = p->leg[j];
    }
    return p->nr;
}

int Prefix(const char c[])
{
    int i, j;
    Nod *p;
    int lung = 0;
    p = L;
    for(i = 0; c[i] != 0; i++)
    {
        j = c[i] - 'a';
        if(p -> leg[j] == NULL)
            return lung;
        lung++;
        p = p->leg[j];
        if(p->cnt == 0)
            return lung - 1;
    }
    return lung;
}

void Citeste()
{
    int op;
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    while(fin >> op >> c)
    {
        if(op == 0) InsCuv(c);
        if(op == 1) Sterge(c);
        if(op == 2) fout << NrAp(c) << "\n";
        if(op == 3) fout << Prefix(c) << "\n";
    }
    fin.close();
    fout.close();
}

int main()
{
    Init();
    Citeste();
    return 0;
}