Cod sursa(job #2622528)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 1 iunie 2020 14:02:36
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <bits/stdc++.h>

using namespace std;

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

char p[50];

struct Trie
{
    int nrfii, cnt;
    Trie *fiu[26];
    Trie (){
        nrfii = cnt = 0;
        for (int i = 0; i < 26; ++i) fiu[i] = nullptr;
    }
};

Trie *T = new Trie;

void ins(Trie *nod, char *s)
{
    if (*s == '\0')
    {
        nod->cnt++;
        return;
    }
    if (nod->fiu[*s - 'a'] == nullptr)
    {
        nod->nrfii++;
        nod->fiu[*s - 'a'] = new Trie;
    }
    ins(nod->fiu[*s - 'a'], s + 1);
}

bool del(Trie *nod, char *s)
{
    if( *s == '\0' )
		nod->cnt --;
	else if( del( nod->fiu[ *s - 'a' ], s+1 ) ) {
			nod->fiu[ *s - 'a' ] = 0;
			nod->nrfii --;
		}

	if( nod->cnt == 0 && nod->nrfii == 0 && nod != T ) {
		delete nod; return 1;
	}
	return 0;
}

int numara(Trie *nod, char *s)
{
    if (*s == '\0')
    {
        return nod->cnt;
    }
    if (nod->fiu[*s - 'a'] == nullptr) return 0;
    return numara(nod->fiu[*s - 'a'], s + 1);
}

int numara2(Trie *nod, char *s, int k)
{
    if (*s == '\0')
    {
        return k;
    }
    if (nod->fiu[*s - 'a'] == nullptr)
    {
        return k;
    }
    return numara2(nod->fiu[*s - 'a'], s + 1, k + 1);

}

int main()
{
    while (fin.getline(p, 40))
    {
        if (p[0] == '0')
        {
            ins(T, p + 2);
        }
        else if (p[0] == '1')
        {
            del(T, p + 2);
        }
        else if (p[0] == '2')
        {
            fout << numara(T, p + 2) << "\n";
        }
        else
        {
            fout << numara2(T, p + 2, 0) << "\n";
        }
    }
    fin.close();
    fout.close();
    return 0;
}