Pagini recente » Cod sursa (job #605076) | Cod sursa (job #2160808) | Cod sursa (job #596014) | Cod sursa (job #2854371) | Cod sursa (job #1225210)
#include<cstdio>
#include<cstring>
const int L=20,S=30;
struct Node{
Node*v[S+1];
int no,noS;
Node(){
this->no=0;
this->noS=0;
memset(v,0,sizeof(v));
}
};
Node*trie=new Node;
FILE*in,*out;
char word[L+1];
void add(Node*node,char*s ) {
char c=*s-'a';
if(*s=='\n'){
node->no++;
return;
}
if(node->v[c]==0){
node->v[c]=new Node;
node->noS++;
}
add(node->v[c],s+1);
}
int del(Node*node,char*s){
char c=*s-'a';
if(*s=='\n')
node->no--;
else if(del(node->v[c],s+1)){
node->v[c]=0;
node->noS--;
}
if(node->no==0&&node!=trie&&node->noS==0){
delete node;
return 1;
}
return 0;
}
int que(Node*node,char*s){
char c=*s-'a';
if(*s=='\n')
return node->no;
if(node->v[c])
return que(node->v[c],s+1);
return 0;
}
int pre(Node*node,char*s,int k){
char c=*s-'a';
if(*s=='\n'||node->v[c]==0)
return k;
return pre(node->v[c],s+1,k+1);
}
int main(){
int type,x;
in=fopen("trie.in","r");
out=fopen("trie.out","w");
while(true){
x=fscanf(in,"%d ",&type);
fgets(word,L+1,in);
if(x<1)
break;
if(type==0)
add(trie,word);
else if(type==1)
del(trie,word);
else if(type==2)
fprintf(out,"%d\n",que(trie,word));
else
fprintf(out,"%d\n",pre(trie,word,0));
}
return 0;
}