Pagini recente » Istoria paginii utilizator/dolhasca001 | Cod sursa (job #1725931) | Istoria paginii runda/drastik_challange_1/clasament | onisim2009-7 | Cod sursa (job #1001156)
#include<fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int op;
char cuv[310];
struct trie{
int nc , nf;
trie *f[26];
trie(){
nc = nf = 0;
for(int i = 0 ; i <= 25 ; i++)
f[i] = 0;
}
}*r , *R;
void add( trie *r , char *a ){
if( (*a) == '\0' ){
r->nc++;
return;
}
int ch = (*a) - 'a';
if( r->f[ch] == 0 ){
r->f[ch] = new trie;
r->nf++;
}
add( r->f[ch] , a+1 );
}
int sterge( trie *r , char *a){
if( (*a) == '\0' ){
r->nc--;
if( r->nc == 0 && r->nf == 0 && R != r ){
delete r;
return 1;
}
return 0;
}
int ch = (*a) - 'a';
int ok = sterge( r->f[ch] , a+1 );
if(ok){
r->nf--; r->f[ch] = 0;
}
if( r->nf == 0 && r->nc == 0 && r != R ){
delete r;
return 1;
}
return 0;
}
int print( trie* r , char *a ){
if( (*a) == '\0' )
return r->nc;
int ch = (*a) - 'a';
if( r->f[ch] == 0 )
return 0;
return print(r->f[ch] , a+1);
}
int search( trie *r , char *a , int niv ){
if( (*a) == '\0' )
return niv;
int ch = (*a) - 'a';
if( r->f[ch] == 0 )
return niv;
return search(r->f[ch] , a+1 , niv+1);
}
int main(){
r = new trie; R = r;
while( f>>op ){
f>>cuv;
switch( op ){
case 0:
add(r , cuv);
break;
case 1:
sterge(r , cuv);
break;
case 2:
g<<print(r , cuv)<<"\n";
break;
case 3:
g<<search(r , cuv , 0)<<"\n";
break;
}
}
return 0;
}