Pagini recente » Cod sursa (job #1578406) | Cod sursa (job #712193) | Cod sursa (job #3156315) | Cod sursa (job #763497) | Cod sursa (job #544501)
Cod sursa(job #544501)
#include<cstdio>
#include<cstring>
#include<string>
const int maxl = 45;
using namespace std;
char sir[maxl];
struct Trie {
int cnt , nrfii;
Trie *fiu[26];
Trie () {
cnt = nrfii = 0;
memset( fiu , 0 , sizeof(fiu));
}
};
Trie *T = new Trie;
void insert ( Trie *nod , char *s ) {
if( *s == '\n' ) {
nod -> cnt ++;
return;
}
if (nod -> fiu[*s - 'a'] == 0 ) {
nod -> fiu[*s - 'a'] = new Trie;
nod -> nrfii++;
}
insert(nod -> fiu[*s - 'a'] , s + 1);
}
int del (Trie *nod , char *s ) {
if( *s == '\n' )
nod -> cnt--;
else if ( del( nod -> fiu[*s - 'a'] , s + 1) ) {
nod -> fiu[*s - 'a'] = 0 ;
nod -> nrfii--;
}
if( nod->cnt == 0 && nod->nrfii == 0 && nod!= T ) {
delete nod;
return 1;
}
return 0;
}
int count (Trie *nod , char *s) {
if (*s == '\n')
return nod -> cnt;
if ( nod -> fiu[*s - 'a'] )
return count(nod -> fiu[*s - 'a'], s + 1);
return 0;
}
int pre (Trie *nod , char *s , int depth) {
if(*s == '\n' || nod -> fiu[*s - 'a'] == 0)
return depth;
return pre(nod -> fiu[*s - 'a'], s + 1, depth + 1);
}
int main()
{
freopen ("trie.in","r",stdin);
freopen ("trie.out","w",stdout);
for ( ; ! feof(stdin) ; ) {
fgets( sir , 40 , stdin);
if(feof(stdin)) continue;
if( sir[0] == '0')
insert(T, sir + 2);
if( sir[0] == '1')
del(T, sir + 2);
if( sir[0] == '2')
printf("%d\n",count(T, sir + 2));
if( sir[0] == '3' )
printf("%d\n",pre(T ,sir + 2 , 0));
}
return 0;
}