Pagini recente » Cod sursa (job #40575) | Cod sursa (job #767503) | Cod sursa (job #1760498) | Istoria paginii utilizator/aliqhuart | Cod sursa (job #1347047)
#include <fstream>
#define fiu f[*s-'a']
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char s[27];
struct trie{
int nr,fii;
trie *f[26];
trie(){
nr=fii=0;
for(int i=0;i<26;i++)
f[i]=NULL;
}
};
trie *root;
void update(trie *r,char *s){
if(*s){
if(r->fiu==0){
r->fii++;
r->fiu=new trie;
}
update(r->fiu,s+1);
}
else
r->nr++;
}
int del(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(del(r->fiu,s+1)){
r->fii--;
if(r->nr==0 && r->fii==0 && r!=root){
delete r;
r=NULL;
return 1;
}
}
return 0;
}
int query1(trie *r,char *s){
if(*s==0)
return r->nr;
if(r->fiu==NULL)
return 0;
return query1(r->fiu,s+1);
}
int query2(trie *r,char *s){
if(*s==0 || r->fiu==NULL)
return 0;
return 1+query2(r->fiu,s+1);
}
int main(){
int i,j,t;
root=new trie;
while(fin>>t>>s){
if(t==0){
update(root,s);
continue;
}
if(t==1){
del(root,s);
continue;
}
if(t==2){
fout<<query1(root,s)<<"\n";
continue;
}
if(t==3){
fout<<query2(root,s)<<"\n";
}
}
fin.close();fout.close();
return 0;
}