Cod sursa(job #2316665)

Utilizator bogdi1bogdan bancuta bogdi1 Data 12 ianuarie 2019 10:58:56
Problema Trie Scor 100
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <cstdio>

using namespace std;
struct Trie{
	Trie(){
		counter=0;
		nr_fii=0;
		for(int i=0; i<26; ++i)
            sons[i]=NULL;
}
	int counter,nr_fii;
	Trie* sons[26];
};
char s[21];
Trie *root=new Trie;
int lung;
void insert(Trie *nod, char* letter) {
	if(*letter==0){
        nod->counter++;
        return;
    }
    if(nod->sons[*letter- 'a']==NULL){
        nod->sons[*letter-'a']=new Trie;
        nod->nr_fii++;
    }
    insert(nod->sons[*letter-'a'], letter+1);
}
bool erase(Trie *nod, char *letter)
{
	if(*letter==0){
		if(nod->counter>0){
			nod->counter--;
		}
    }
    else {
        if(nod->sons[*letter-'a']==NULL)
            return false;
        if(erase(nod->sons[*letter-'a'], letter+1)) {
            nod->nr_fii--;
            nod->sons[*letter-'a']=NULL;
        }
    }
    if(nod->nr_fii==0 && nod->counter==0 && nod!=root) {
        delete nod;
        return true;
    }
    return false;
}
int finder(Trie *nod, char *letter)
{
	if(*letter==0)
		return nod->counter;
	if(nod->sons[*letter-'a']==NULL)
		return 0;
	return finder(nod->sons[*letter-'a'], letter+1);
}
int operatie(Trie *nod, char *letter)
{
    if(*letter==0)
        return lung;
    if(nod->sons[*letter-'a']==NULL)
        return lung;
    else{
        lung++;
        return operatie(nod->sons[*letter-'a'], letter+1);
    }
}
int main()
{   freopen("trie.in", "r",stdin);
    freopen("trie.out", "w",stdout);
    int op;
    while(scanf("%d ", &op)==1){
        scanf("%s", s);
        if(op==0)
            insert(root, s);
        else{
            if(op==1)
                erase(root, s);
            else{
                if(op==2)
                    printf("%d\n", finder(root, s));
                else{
                    lung=0;
                    printf("%d\n", operatie(root, s));
                }
            }
        }
    }
    return 0;
}