Cod sursa(job #711173)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 11 martie 2012 15:38:33
Problema Trie Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<cstdio>
#include<cstring>

using namespace std;
char s[26];

struct word { 
	int val, fii;
	word *fiu[26];
	
	word(){
		val = fii = 0;
		memset(fiu, 0, sizeof(fiu));
	}
} *W = new word;

void Insert(word *cuv, int lit) {
	if (!s[lit]) {
		cuv -> val ++; return;
	}
	
	else{
		if (cuv -> fiu[s[lit] - 'a'] == 0)	cuv -> fiu[s[lit] - 'a'] = new word;
		cuv -> fii ++;
		Insert(cuv -> fiu[s[lit] - 'a'], lit + 1);
	}
}

int Delete(word *cuv, int lit) {
	if (!s[lit]) {
		cuv -> val--;
	}
	else if (Delete(cuv -> fiu[s[lit] - 'a'], lit + 1)){
		cuv -> fii--;
		cuv -> fiu [s[lit] - 'a'] = 0;
	}
	
	if (cuv -> fii == 0 && cuv -> val == 0 && cuv != W){ 
			delete cuv; return 1;
		}
	return 0;
}


int Print(word *cuv, int lit) {
	if (!s[lit]) 
		return cuv -> val;
	else if (cuv -> fiu[s[lit] - 'a'])
		return Print(cuv -> fiu[s[lit] - 'a'], lit + 1);
	return 0;
}

int Prefix(word *cuv, int lit) {
	if (!s[lit] || cuv -> fiu[s[lit] - 'a'] == 0) return lit;
	else return Prefix(cuv -> fiu[s[lit] - 'a'], lit + 1);
}

int main() {
	int tip;
	freopen("trie.in", "r", stdin), freopen("trie.out", "w", stdout);
	
	while(scanf("%d %s", &tip, s) != EOF) {
		if(tip == 0) Insert(W, 0);		
		if(tip == 1) Delete(W, 0);	
		if(tip == 2) printf("%d\n", Print(W, 0));		
		if(tip == 3) printf("%d\n", Prefix(W, 0));
	}
	
	return 0;
}