Pagini recente » Cod sursa (job #1834085) | Cod sursa (job #1692768) | Cod sursa (job #1642989) | Cod sursa (job #202786) | Cod sursa (job #867928)
Cod sursa(job #867928)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie{
int nrfii;
int contor;
Trie *fiu[26];
Trie() {
contor = nrfii = 0;
memset( fiu, 0, sizeof( fiu ) );
}
};
Trie *T = new Trie;
void adauga(Trie *nod , char *s){
if(*s == '\n'){
nod->contor++;
return ;
}
if(nod->fiu[*s - 'a'] == 0){
nod->fiu[*s - 'a'] = new Trie;
nod->nrfii++;
}
adauga(nod->fiu[*s-'a'], s+1);
}
inline int sterge(Trie *nod, char *s){
if(*s == '\n')
nod->contor--;
else
if( sterge(nod->fiu[*s - 'a'], s+1) ){
nod->fiu[*s - 'a'] = 0;
nod->nrfii--;
}
if(nod->contor == 0 && nod->nrfii == 0 && nod != T){
delete nod;
return 1;
}
return 0;
}
inline int aparitii(Trie *nod, char *s){
if(*s == '\n')
return nod->contor;
if(nod->fiu[*s - 'a'])
return aparitii(nod->fiu[*s - 'a'], s+1);
return 0;
}
inline int lungime(Trie *nod, char *s, int nr){
if(*s == '\n' || nod->fiu[*s - 'a'] == 0)
return nr;
return lungime(nod->fiu[*s-'a'], s+1, nr+1);
}
void rezolva(){
freopen( "trie.in", "r", stdin );
freopen( "trie.out", "w", stdout );
char s[32];
fgets(s, 32, stdin);
while( !feof(stdin) ){
switch(s[0]) {
case '0': adauga( T, s+2 ); break;
case '1': sterge( T, s+2 ); break;
case '2': printf( "%d\n", aparitii( T, s+2 ) ); break;
case '3': printf( "%d\n", lungime( T, s+2, 0 ) ); break;
}
fgets(s, 32, stdin);
}
}
int main(){
rezolva();
return 0;
}