Cod sursa(job #574408)

Utilizator costyv87Vlad Costin costyv87 Data 7 aprilie 2011 09:59:44
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <vector>
using namespace std;
#define CH (s[0]-'a')

struct Trie {
	int cnt,nrfii;
	Trie *fiu[26];

	Trie() {
		cnt=nrfii=0;
		memset(fiu,0,sizeof(fiu));
		}
	};

Trie *T=new Trie;

void add(Trie *nod, char *s) {
if (*s == '\n') {
	nod->cnt ++; 
	return;
	}
if (nod->fiu[ CH ] == 0) {
	nod->fiu[ CH ] = new Trie;
	nod->nrfii ++;
	}
	add(nod ->fiu[ CH ],s+1);
}	

int del( Trie *nod, char *s) {
if (*s == '\n') {
	nod -> cnt--;
	}
else 
	if ( del(nod -> fiu[ CH ],s+1) ) {
		nod -> fiu[ CH ] = 0;
		nod -> nrfii--;
		}
	
	if (nod -> cnt == 0 && nod-> nrfii == 0 && nod != T ) {
		delete nod; return 1;
		}
	return 0;
}

int cuv(Trie *nod , char *s) {

if ( *s == '\n') {
	return nod -> cnt;
	}	

if (nod -> fiu[ CH ] )  {
	return cuv( nod -> fiu[CH],s+1);
	}	
return 0;
}

int ask(Trie *nod, char *s,int k) {
if (nod -> fiu[ CH ] == 0 || *s == '\n') 
	return k;
return (ask(nod -> fiu[ CH ], s+1, k+1));
}

int main() {
FILE *f,*g;
f=fopen("trie.in","r");
g=fopen("trie.out","w");
char s[50];
fgets(s,32,f);

while (!feof(f)) {
	switch (*s) {
		case '0' : add(T,s+2); break;
		case '1' : del(T,s+2); break;
		case '2' : fprintf(g,"%d\n",cuv(T, s+2)); break;
		case '3' : fprintf(g,"%d\n",ask(T, s+2, 0)); break;
		}
	fgets(s,32,f);
	}

fclose(g);

return 0;
}