Cod sursa(job #1245598)

Utilizator roxana.istratePoenaru Roxana roxana.istrate Data 19 octombrie 2014 17:23:10
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <vector>
using namespace std;

class Trie{
public:
	int passing;
	int finish;
	Trie* alphabet[26];
	Trie(){
		passing = 0;
		finish = 0;
		for(int i = 0; i < 26; i++)
			alphabet[i] = 0;
	}
};

Trie *root;

void insertW(char *cuv, int len){
	if(!root) {
		root = new Trie; 
	}
	Trie *t = root;
	for(int i = 0; i < len; i++){
		if(t->alphabet[cuv[i]-'a'] == 0){
			t->alphabet[cuv[i]-'a'] = new Trie;
		}
		t->passing ++;
		t = t->alphabet[cuv[i]-'a'];
	}
	t->finish ++;
	t->passing ++;
}

void deleteW(char *cuv, int len){
	Trie *t = root, *prev;
	t->passing--;
	prev = t;
	for(int i = 0; i < len; i++){
		t = t->alphabet[cuv[i]-'a'];
		t->passing--;
		prev = t;
	}                 
	t->finish--;
}

void how_many(char *cuv, int len){
	Trie *t = root;
	for(int i = 0; i < len; i++){
		if(!t || !t->passing){
			printf("0\n");
			return ;
		}
		t = t->alphabet[cuv[i]-'a'];
	}
	(!t)? printf("0\n") : printf("%d\n", t->finish);
}

void prefix(char *cuv, int len){
	Trie *t = root;
	if(!t) { printf("0\n"); return ; }
	for(int i = 0; i < len; i++){
		t = t->alphabet[cuv[i]-'a'];
		if(!t || !t->passing){
			printf("%d\n", i);
			return ;
		}
	}
	printf("%d", len);
}

int main(){
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	char w[10000];
	int op;
	root = new Trie;
	while(scanf("%d%s", &op, w) != EOF){
		switch(op){
		case 0: insertW(w, strlen(w)); break;
		case 1: deleteW(w, strlen(w)); break;
		case 2: how_many(w, strlen(w)); break;
		case 3: prefix(w, strlen(w));
		}
	}
}