Cod sursa(job #1757113)

Utilizator radu_uniculeu sunt radu radu_unicul Data 14 septembrie 2016 15:47:37
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
string s;


struct trie
{
    int cnt, nrfii;
    trie *fiu[26];
    trie()
    {
        cnt = nrfii = 0;
        memset (fiu, 0, sizeof (fiu));
    }
};

trie *t= new trie;

void add (trie *nod, int k)
{
    if (k == s.size() )
    {

        nod->cnt++;
        return;
    }
    if (nod->fiu[s[k] - 'a'] == 0)
    {
        //  cout << s[k];
        nod->fiu[s[k]-'a'] = new trie;
        nod->nrfii++;
    }
    add (nod->fiu[s[k] - 'a'], k + 1);
}

int del (trie *nod, int k)
{
    if (k == s.size() )
    {

        nod->cnt --;
    }
    else if (del( nod->fiu[s[k] - 'a'], k + 1) == 1)
    {
        nod->fiu[s[k]-'a'] = 0;
        nod->nrfii--;
    }
    if (nod->cnt == 0 && nod->nrfii == 0 && nod != t)
    {
        delete nod;
        return 1;
    }
    return 0;

}


int cuv (trie *nod, int k)
{
    if (k == s.size() )
    {
        return nod->cnt;
    }
    else if (nod->fiu[s[k] - 'a'])
        cuv (nod->fiu[s[k] - 'a'], k + 1);

    else
        return 0;
}

int pre (trie *nod, int k)
{
    if (k == s.size() )
        return 0;
    if (nod->fiu[s[k] - 'a'])
        return 1 + pre (nod->fiu[s[k] - 'a'], k + 1);
    return 0;
}

int main()
{
    int n, op;
    ifstream fin ("trie.in");
    ofstream fout ("trie.out");
    while (fin >> op >> s)
    {
        if (op == 0)
        {
            add (t, 0);
        }
        if (op == 1)
            del (t, 0);

        if (op == 2)
        {
            int sol = cuv(t, 0);
            fout  << sol << "\n";
        }
        if (op == 3)
            fout << pre (t,0) << "\n";

    }
    return 0;
}