Pagini recente » Cod sursa (job #50143) | Cod sursa (job #2533053) | Cod sursa (job #1581567) | Cod sursa (job #2031898) | Cod sursa (job #304600)
Cod sursa(job #304600)
#include<stdio.h>
#include<string.h>
using namespace std;
struct trie
{ int cnt;int son;
trie *sons[26];
trie(){cnt=son=0;memset(sons,0,sizeof(sons));}
};
trie *root=new trie;
void add(trie *nod, char *s)
{ if(*s=='\n') { ++nod->cnt;return;}
if(!nod->sons[*s-'a']) { nod->sons[*s-'a']=new trie;
}
++nod->son;
add(nod->sons[*s-'a'],s+1);
}
bool del(trie *nod,char *s)
{ if(*s=='\n') --nod->cnt;
else if(del(nod->sons[*s-'a'],s+1)){ nod->sons[*s-'a']=0;
--nod->son;
}
if(nod->cnt==0&&nod->son==0&&nod!=root) { delete nod;return 1;}
return 0;
}
int que(trie *nod,char *s)
{ if(*s=='\n') return nod->cnt;
if(nod->sons[*s-'a']) return que(nod->sons[*s-'a'],s+1);
return 0;
}
int pre(trie *nod,char *s,int ord)
{ if(*s=='\n'||nod->sons[*s-'a']==0) return ord;
return pre(nod->sons[*s-'a'],s+1,ord+1);
}
char a[40];
int main()
{ freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while(!feof(stdin)){ fgets(a,sizeof(a),stdin);
if(a[0]=='0') add(root,a+2);
else if(a[0]=='1') del(root,a+2);
else if(a[0]=='2') printf("%d\n",que(root,a+2));
else printf("%d\n",pre(root,a+2,0));
}
fclose(stdin);
fclose(stdout);
return 0;
}