Cod sursa(job #2219709)

Utilizator mihailarminia1234Arminia Mihail mihailarminia1234 Data 9 iulie 2018 16:35:51
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.82 kb
#include <iostream>
#include <stdio.h>

using namespace std;

struct Trie
{
        int nrCuv, nrFii;
        Trie *fiu[26];

        Trie()
        {
                nrCuv = 0;
                nrFii = 0;
                for (int i = 0; i < 26; ++i)
                        fiu[i] = 0;
        }
};

Trie *R;
char cuv[21];

void inserare (Trie *nod, char *s)
{
        if ((*s) == '\n')
        {
                ++(nod -> nrCuv);
                return;
        }

        int pozLitera = (*s) - 'a';

        if (nod -> fiu[pozLitera] == 0)
        {
                nod -> fiu[pozLitera] = new Trie;
                ++(nod -> nrFii);
        }

        inserare (nod -> fiu[pozLitera], s + 1);
}

int del (Trie *nod, char *s)
{
        if ((*s) == '\n')
                --(nod -> nrCuv);
        else
        {
                int pozLitera = (*s) - 'a';
                int rez = del (nod -> fiu[pozLitera], s + 1);

                if (rez == 1)
                {
                        nod -> fiu[pozLitera] = 0;
                        --(nod -> nrFii);
                }
        }

        if (nod -> nrCuv == 0 && nod -> nrFii == 0 && nod != R)
        {
                delete nod;
                return 1;
        }

        return 0;
}

int query (Trie *nod, char *s)
{
        if ((*s) == '\n')
                return nod -> nrCuv;

        int pozLitera = (*s) - 'a';

        if (nod -> fiu[pozLitera] != 0)
                return query (nod -> fiu[pozLitera], s + 1);

        return 0;
}

int f (Trie *nod, char *s, int k)
{
        if ((*s) == '\n' || nod -> fiu[(*s) - 'a'] == 0)
                return k;

        return f (nod -> fiu[(*s) - 'a'], s + 1, k + 1);
}

int main()
{
        R = new Trie;

        freopen ("trie.in", "r", stdin);
        freopen ("trie.out", "w", stdout);

        fgets (cuv, 21, stdin);

        while (!feof(stdin))
        {
                switch (cuv[0])
                {
                        case '0' :
                        {
                                inserare (R, cuv + 2);
                                break;
                        }
                        case '1' :
                        {
                                del (R, cuv + 2);
                                break;
                        }
                        case '2' :
                        {
                                cout << query (R, cuv + 2) << '\n';
                                break;
                        }
                        case '3' :
                        {
                                cout << f (R, cuv + 2, 0) << '\n';
                                break;
                        }
                }

                fgets (cuv, 21, stdin);
        }

        return 0;
}