Cod sursa(job #1754479)

Utilizator SaitamaSaitama-san Saitama Data 8 septembrie 2016 12:43:07
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <bits/stdc++.h>

using namespace std;

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

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 -> cnt++;
            p = p -> leg[j];
        }
        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 -> cnt)--;
        p = p -> leg[j];
    }
    (p -> nr)--;
    (p -> cnt)--;
}

int NrAp(const char c[])
{
    int i, j;
    Nod *p;
    p = L;
    for(i = 0; c[i]; 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]; 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;
    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();
}

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