Cod sursa(job #2630263)

Utilizator Leonard123Mirt Leonard Leonard123 Data 24 iunie 2020 21:53:55
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include<bits/stdc++.h>
using namespace std;

struct trie{
	int nr_c,fii;
	trie *l[26];
	trie(){
		memset(l,0,sizeof(l));
		nr_c=fii=0;
	}

};

trie *t=new trie;

void insert (trie *tri,char *c){
	if(*c=='\n'){
		tri->nr_c++;
		return;
	}
	if(tri->l[*c-'a']==0){
		tri->l[*c-'a']=new trie;
		tri->fii++;
	}
	insert(tri->l[*c-'a'], c+1);
}

int del(trie *tri, char *c){
	if(*c=='\n')
		tri->nr_c--;
	else  if(del(tri->l[*c-'a'],c+1))
		tri->fii--, tri->l[*c-'a']=0;
	if(tri->nr_c==0 && tri->fii==0 && tri!=t){
		delete tri; return 1;
	}
	return 0;
}

int cuvant(trie *tri, char *c){
	if(*c=='\n')
		return tri->nr_c;
	if(tri->l[*c-'a']!=0)
		return cuvant(tri->l[*c-'a'], c+1);
	return 0;
}

int prefix(trie *tri, char *c, int k){
	if(*c=='\n' || tri->l[*c-'a']==0)
		return k;
	return prefix(tri->l[*c-'a'], c+1, k+1);
}

int main(){
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	char c[25];
       	while(!feof(stdin)){
		switch(c[0]){
			case '0': insert(t, c+2); break;
			case '1': del(t, c+2); break;
			case '2': cout<<cuvant(t,c+2)<<'\n'; break;
			case '3': cout<<prefix(t,c+2,0)<<'\n'; break;
		}
		fgets(c,25,stdin);
	}
}