Pagini recente » Cod sursa (job #620442) | Cod sursa (job #1228871) | Cod sursa (job #1275703) | Cod sursa (job #2663539) | Cod sursa (job #1666244)
#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){
/*
if( d->fii == 0 && d->opriti == 0 ){
delete d;
}*/
}
return ;
}
if( d->fiu[*c-'a'] )
del( c+1,d->fiu[*c-'a'] );
if(ok){
if( d->fiu[*c-'a']->fii == 0 && d->fiu[*c-'a']->opriri == 0 ){
d->fii--;
delete d->fiu[*c-'a'];
d->fiu[*c-'a'] = 0;
}
}
}
void aparitii(char *c,nod *d){
if( *c == '\0' ){
ok = d->opriri;
return;
}
if( !(d->fiu[*c - 'a']) )
return ;
aparitii( c+1,d->fiu[*c-'a'] );
}
void prefix(char *c,nod *d){
if( *c == '\0' ){
ok = h;
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;
if( buf[2] == 'n' ){
--ok;
++ok;
}
prefix(buf+2,t);
printf("%d\n",ok);
break;
}
}
}
return 0;
}