Cod sursa(job #2725571)

Utilizator calinfloreaCalin Florea calinflorea Data 19 martie 2021 10:54:58
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin ("trie.in");
ofstream fout ("trie.out");
char cuv[21];
struct Nod
{
    int cnt , nr;
    Nod * leg[26];
};

Nod * L;

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

void Delete(const char cuv[])
{
    int x;
    Nod *p;
    p = L;
    for(int i = 0 ; cuv[i] ; i++)
    {
        x = cuv[i] - 'a';
        p = p -> leg[x];
        p -> cnt--;
    }
    p -> nr--;
}

int FindCuvant(const char cuv[])
{
    int x;
    Nod *p;
    p = L;
    for(int i = 0 ; cuv[i] ; i++)
    {
        x = cuv[i] - 'a';
        if(p -> leg[x] == 0)
            return 0;
        p = p -> leg[x];
    }
    return (p -> nr);
}

inline int FindPrefix(const char cuv[])
{
    int x , ans = 0;
    Nod *p;
    p = L;
    for(int i = 0 ; cuv[i] ; i++)
    {
        x = cuv[i] - 'a';
        if(p -> leg[x] == 0 || p -> leg[x] -> cnt == 0)
            return ans;
        ans++;
        p = p -> leg[x];
    }
    return ans;
}

int main()
{
    int op;
    L = new Nod;
    L -> cnt = 0;
    L -> nr = 0;

    for(int i = 0 ; i < 26 ; i++)
        L -> leg[i] = 0;

    while(fin >> op >> cuv)
    {
        //cout << op << " " << cuv << "\n";
        if(op == 0)
            Insert(cuv);
        else if(op == 1)
            Delete(cuv);
        else if(op == 2)
            fout << FindCuvant(cuv) << "\n";
        else fout << FindPrefix(cuv) << "\n";
    }

    fin.close();
    fout.close();

    return 0;
}