Cod sursa(job #663863)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 19 ianuarie 2012 02:57:32
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 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;
	}
	
	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);
	}
}

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


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;
}