Pagini recente » Cod sursa (job #2411933) | Cod sursa (job #902493) | Cod sursa (job #2672744) | Cod sursa (job #2945111) | Cod sursa (job #1212461)
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream g("trie.out");
struct trie{
int fii,nr;
trie *f[26];
trie(){
fii=nr=0;
for(register int i=0;i<=26;i++) f[i]=0;
}
};
trie *root=new trie;
char s[25];
void update(trie *r,char *s){
if(*s!=0){
if(r->f[*s-'a']==0){
r->f[*s-'a']=new trie;
r->fii++;
}
update(r->f[*s-'a'],s+1);
}
else
r->nr++;
}
int deleteword(trie *&r, char *s) {
if (*s==0) {
r->nr--;
if (r->nr==0 && r->fii==0 && r!=root) {
delete r;
r=NULL;
return 1;
}
} else {
if (deleteword(r->f[*s-'a'],s+1)) {
r->fii--;
if (r->fii==0 && r->nr==0 && r!=root) {
delete r;
r=NULL;
return 1;
}
}
}
return 0;
}
int query(trie *&r,char *s){
if(*s==0)
return r->nr;
if(r->f[*s-'a']==NULL)
return 0;
return query(r->f[*s-'a'],s+1);
}
int prefix(trie *&r,char *s){
if(*s==0)
return 0;
if(r->f[*s-'a']==NULL)
return 0;
return 1+prefix(r->f[*s-'a'],s+1);
}
int main(void){
register int i,j,t;
while(fin>>t>>s){
switch(t){
case 0:
update(root,s);
break;
case 1:
deleteword(root,s);
break;
case 2:
g<<query(root,s)<<"\n";
break;
default:
g<<prefix(root,s)<<"\n";
}
}
fin.close();
g.close();
return 0;
}