Pagini recente » Cod sursa (job #826560) | Cod sursa (job #207028) | Cod sursa (job #283611) | Cod sursa (job #1751449) | Cod sursa (job #2487555)
#include <iostream>
#include<cstdio>
using namespace std;
const int SIGMA=26;
struct Trie{
Trie *children[SIGMA];
int nWord,nChild;
Trie (){
nWord=0;
nChild=0;
for(int i=0;i<SIGMA;i++)
children[i]=NULL;
}
};
Trie *root= new Trie;
void insert_trie(Trie *nod,char *s){
if(s[0]=='\0'){
nod->nWord++;
return;
}
else{
if(nod->children[s[0]-'a']==NULL){
nod->children[s[0]-'a']=new Trie;
nod->nChild++;
}
insert_trie(nod->children[s[0]-'a'],s+1);
}
}
bool delete_trie(Trie *nod,char *s){
if(s[0]=='\0'){
nod->nWord--;
}
else if(delete_trie(nod->children[s[0]-'a'],s+1)){
nod->nChild--;
nod->children[s[0]-'a']=NULL;
}
if(nod->nWord==0 && nod->nChild==0 && nod!=root){
delete nod;
return 1;
}
return 0;
}
int find_trie(Trie *nod,char *s){
if(s[0]=='\0'){
return nod->nWord;
}
if(nod->children[s[0]-'a']==NULL)
return 0;
return find_trie(nod->children[s[0]-'a'],s+1);
}
int findpref_trie(Trie *nod,char *s){
if(s[0]=='\0')
return 0;
if(nod->children[s[0]-'a']==NULL)
return 0;
return 1+findpref_trie(nod->children[s[0]-'a'],s+1);
}
char s[30];
int main()
{
int type;
FILE*fin,*fout;
fin=fopen("trie.in","r");
fout=fopen("trie.out","w");
while(!feof(fin)){
fscanf(fin,"%d %s ",&type,s);
if(type==0){
insert_trie(root,s);
}
else if(type==1){
delete_trie(root,s);
}
else if(type==2){
fprintf(fout,"%d\n",find_trie(root,s));
}
else{
fprintf(fout,"%d\n",findpref_trie(root,s));
}
}
return 0;
}