Pagini recente » Cod sursa (job #847866) | Cod sursa (job #1995693) | Cod sursa (job #412079) | Cod sursa (job #1179321) | Cod sursa (job #1666206)
#include <bits/stdc++.h>
using namespace std;
char buf[32];
struct nod{
int opriri,fii;
nod *fiu[26];
nod() {
opriri = 0;
fii =0;
memset(fiu,0,(sizeof(fiu) ));
}
};
nod *d,*t = new nod,*nod_null = new nod;
char *c;
int ok,h;
void del(char *c,nod *d){
if( *c == '\0' ){
if( d->opriri >0 ){
d->opriri--;
ok = 1;
}
if(ok){
d->fii--;
//if( d->fii == 0 ) delete d;
}
return ;
}
if( d->fiu[*c-'a'] )
del( c+1,d->fiu[*c-'a'] );
if(ok){
d->fii--;
if( d->fii == 0 ){
delete d->fiu[*c-'a'];
d->fiu[*c-'a'] = 0;
}
//else d->fiu[*c-'a'] = 0;
}
}
void aparitii(char *c,nod *d){
if( *c == '\0' ){
ok = d->opriri;
return;
}
if( !(d->fiu[*c - 'a']) )
d->fiu[*c-'a'] = new nod;
aparitii( c+1,d->fiu[*c-'a'] );
}
void prefix(char *c,nod *d){
if( *c == '\0' ){
return;
}
//if( d->fii > 0 || d->opriri) ok = h;
//if( !(d->fiu[*c - 'a']) )
// d->fiu[*c-'a'] = new nod;
if( !(d->fiu[*c-'a']) ) return;
++h; ok = h;
prefix( c+1,d->fiu[*c-'a'] );
}
int main()
{
//freopen("trie.in" , "r" , stdin);
freopen("trie.out", "w" , stdout);
ifstream f("trie.in",ios::in);
while(true){
f.getline(buf,32);
if(buf[0] == '\0') break;
switch( buf[0] ){
case '0':{
c = buf + 2;
d = t;
while(true){
if( *c == '\0' ){
d->opriri++;
d->fii++;
break;
}
if( !(d->fiu[*c - 'a']) )
d->fiu[*c-'a'] = new nod;
d->fii++;
d = d->fiu[*c - 'a'];
++c;
}
break;
}
case '1':{
ok = 0;
del(buf+2,t);
break;
}
case '2':{
ok = 0;
aparitii( buf+2,t );
printf("%d\n",ok);
break;
}
case '3':{
ok = 0;h = 0;
prefix(buf+2,t);
printf("%d\n",ok);
break;
}
}
}
return 0;
}