Cod sursa(job #1754472)

Utilizator BlackNestaAndrei Manaila BlackNesta Data 8 septembrie 2016 12:27:54
Problema Trie Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <bits/stdc++.h>

using namespace std;

ofstream g("trie.out");

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

Nod *L;

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

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

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

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

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

void Citire()
{
    ifstream f("trie.in");
    Init();
    int op;
    char ch[27];
    while(f >> op >> ch)
    {
        if(op == 0) InsCuv(ch);
        if(op == 1) StergeCuv(ch);
        if(op == 2) g << NrAp(ch) << "\n";
        if(op == 3) g << Prefix(ch) << "\n";
    }
    f.close();
    g.close();
}

int main()
{
    Citire();
    return 0;
}