Cod sursa(job #2634910)

Utilizator rebecca0312Andrei Rebecca rebecca0312 Data 12 iulie 2020 18:12:07
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include<bits/stdc++.h>

#define CH (*s - 'a')
using namespace std;

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

Trie *T=new Trie;

void add(Trie *nod, char *s){
	if(*s=='\n'){
		nod->cnt++;
		return;
	}
	if(nod->fiu[CH]==0) {
		nod->fiu[CH]=new Trie;
		nod->nr_fii++;
	}
	add(nod->fiu[CH], s+1);
}

int del(Trie *nod, char *s){
	if(*s=='\n')
		nod->cnt--;
	else if(del(nod->fiu[CH], s+1)){
        nod->fiu[ CH ]=0;
        nod->nr_fii--;
    }
	if(nod->cnt==0 && nod->nr_fii==0 && nod!=T){
		delete nod;
		return 1;
	}
	return 0;
}

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

int prefix(Trie *nod, char *s, int k){
	if(*s=='\n' || nod->fiu[CH]==0)
		return k;
	return prefix(nod->fiu[CH], s+1, k+1);
}

int main(){
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
    char line[32];
	fgets(line, 32, stdin);
	while(!feof(stdin)){
        if(line[0]=='0')
            add(T, line+2);
        else if(line[0]=='1')
            del(T, line+2);
        else if(line[0]=='2')
            printf("%d\n", nrap(T, line+2));
        else if(line[0]=='3')
            printf("%d\n", prefix(T, line+2, 0));
		fgets(line, 32, stdin);
	}
	return 0;
}