Pagini recente » Cod sursa (job #2542798) | Cod sursa (job #2355065) | Cod sursa (job #3300921) | Cod sursa (job #2135786) | Cod sursa (job #1545241)
#include <iostream>
#define CH (*s - 'a')
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie{
int cnt, nrfii;
Trie *fiu[26];
Trie(){
nrfii = 0;
cnt = 0;
memset( fiu, 0, sizeof( fiu ) );
}
};
Trie *T = new Trie;
void inserare(Trie *nod, char *s){
if(*s == '\n'){
nod->cnt++;
return;
}
if(nod->fiu[CH]==0){
nod->fiu[CH] = new Trie();
nod->nrfii++;
}
inserare(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 line[ 32 ];
freopen( "trie.in", "r", stdin );
freopen( "trie.out", "w", stdout );
fgets( line, 32, stdin );
while( !feof( stdin ) ) {
switch( line[0] ) {
case '0': inserare( T, line+2 ); break;
case '1': del( T, line+2 ); break;
case '2': printf( "%d\n", que( T, line+2 ) ); break;
case '3': printf( "%d\n", pre( T, line+2, 0 ) ); break;
}
fgets( line, 32, stdin );
}
return 0;
}