Cod sursa(job #711292)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 11 martie 2012 20:36:21
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<cstdio>
#include<cstring>
using namespace std;
char s[21];

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;
	}
	if (!cuv -> fiu[s[lit] - 'a']){
		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 && !cuv -> val && 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']) 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));
	}
}