Cod sursa(job #658638)

Utilizator the_snyper06FMI - ALexandru Mihai the_snyper06 Data 9 ianuarie 2012 11:17:00
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<cstdio>
#include<vector>
#define MOD 13

using namespace std;
struct word { int val, child; char lit; vector <word> H[MOD]; } start, *ramif;
vector <word> nul[MOD];
char w[21], pre[21];
int nrLit, nrLitRamif;

word * Parcurgere() {
	int i, j, ind;
	word *nodC = &start;
	
	for(i = 0; w[i]; i++) {
		bool iesi = true;
		ind = (w[i] - 'a') % MOD;
		if(nodC->child > 1) ramif = nodC, nrLitRamif = i;
		for(j = 0; j < (int) nodC->H[ind].size(); j++)
			if(nodC->H[ind][j].lit == w[i]) { nodC = &nodC->H[ind][j]; iesi = false; break; }
		if(iesi) break;
	}
	
	nrLit = i;
	return nodC;
}

void Insert() {
	int i, ind;
	word *nodN, *nodC = Parcurgere();
	
	for(i = nrLit; w[i]; i++) {
		nodN = new word;
		ind = (w[i] - 'a') % MOD;
		nodN->val = 0;
		nodN->lit = w[i];		
		nodN->child = 0;
		nodC->H[ind].push_back(*nodN);
		nodC->child++;
		nodC = &nodC->H[ind][nodC->H[ind].size() - 1];
	}
	nodC->val++;
}

void Delete() {
	int i, ind;
	word *nodC = Parcurgere();
	
	if(--nodC->val == 0) {
		ind = (w[nrLitRamif] - 'a') % MOD;
		for(i = 0; i < (int) ramif->H[ind].size(); i++)
			if(ramif->H[ind][i].lit == w[nrLitRamif]) {
				word aux = ramif->H[ind][i];
				int n = ramif->H[ind].size() - 1;
				ramif->H[ind][i] = ramif->H[ind][n];
				ramif->H[ind][n] = aux;
			}
		ramif->H[ind].pop_back();
	}	
}
void Print() {
	word *nodC = Parcurgere();
	printf("%d\n", nodC->val);
}

void Prefix() { 
	word *nodC = Parcurgere();
	printf("%d\n", nrLit); 
}

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