Pagini recente » Cod sursa (job #1161920) | Cod sursa (job #23763) | Cod sursa (job #2387571) | Cod sursa (job #1901203) | Cod sursa (job #1707190)
#include <cstring>
#include <cstdio>
#define ch (*s-'a')
using namespace std;
struct trie
{ int cnt,nrfii;
trie *fiu[26];
trie()
{ cnt=nrfii=0;
memset(fiu,0,sizeof(fiu));
}
};
trie *t=new trie;
void ins(trie *nod,char *s)
{ if(*s=='\n') {nod->cnt++;return;}
if(nod->fiu[ch]==0)
{ nod->fiu[ch]=new trie;
nod->nrfii++;
}
ins(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 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 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 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' : ins(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;
}