Pagini recente » Cod sursa (job #377417) | Cod sursa (job #606911) | Cod sursa (job #2172999) | Cod sursa (job #954059) | Cod sursa (job #1221860)
#include <fstream>
#define fiu p[*s-'a']
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
char s[26];
struct trie{
int nr,fii;
trie *p[26];
trie(){
fii=nr=0;
for(int i=0;i<26;i++) p[i]=NULL;
}
};
trie *root;
void update(trie *r,char *s){
if(*s){
if(r->fiu==0){
r->fiu=new trie;
r->fii++;
}
update(r->fiu,s+1);
}
else
r->nr++;
}
inline int clearup(trie *&r,char *s){
if(*s==0){
r->nr--;
if(r->nr==0 && r->fii==0 && r!=root){
delete r;
r=NULL;
return 1;
}
return 0;
}
if(clearup(r->fiu,s+1)){
r->fii--;
if(r->fii==0 && r->nr==0 && r!=root){
delete r;
r=NULL;
return 1;
}
}
return 0;
}
inline int query1(trie *r,char *s){
if(*s==0){
return r->nr;
}
if(r->fiu==NULL)
return 0;
return query1(r->fiu,s+1);
}
inline int query2(trie *r,char *s){
if(*s==0)
return 0;
if(r->fiu==NULL){
return 0;
}
else
return 1+query2(r->fiu,s+1);
}
int main(void){
register int i,j,t;
root=new trie;
while(f>>t>>s){
switch(t){
case 0:
update(root,s);
break;
case 1:
clearup(root,s);
break;
case 2:
g<<query1(root,s)<<"\n";
break;
default:
g<<query2(root,s)<<"\n";
}
}
return 0;
}