Cod sursa(job #2560091)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 27 februarie 2020 19:18:06
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include<bits/stdc++.h>
#define CH (*s - 'a')
#define NMAX 200
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
	int cnt, nrfii;
	Trie *fiu[ 26 ];

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

Trie *T = new Trie;

void ins( Trie *nod, char *s ) {
	if( *s == '\n' ) {
		nod->cnt ++; return;
	}

	if( nod->fiu[ CH ] == 0 ) {
		nod->fiu[ CH ] = new Trie;
		nod->nrfii ++;
	}

	ins( 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 que( Trie *nod, char *s ) {
	if( *s == '\n' )
		return nod->cnt;

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

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

int main() {
	char s[NMAX ];

	while(fin.getline(s,NMAX) && s[0] ) {
         int lg=strlen(s);
         s[lg]='\n';
          s[lg+1]=0;
		switch( s[0] ) {
			case '0': ins( T, s+2 ); break;
			case '1': del( T, s+2 ); break;
			case '2': fout<< que( T, s+2 )<<"\n" ; break;
			case '3': fout<< pre( T, s+2, 0)<<"\n"; break;
		}

	}
	return 0;
}