Pagini recente » Cod sursa (job #2387144) | Cod sursa (job #1309075) | Cod sursa (job #2978265) | Cod sursa (job #1025688) | Cod sursa (job #2630263)
#include<bits/stdc++.h>
using namespace std;
struct trie{
int nr_c,fii;
trie *l[26];
trie(){
memset(l,0,sizeof(l));
nr_c=fii=0;
}
};
trie *t=new trie;
void insert (trie *tri,char *c){
if(*c=='\n'){
tri->nr_c++;
return;
}
if(tri->l[*c-'a']==0){
tri->l[*c-'a']=new trie;
tri->fii++;
}
insert(tri->l[*c-'a'], c+1);
}
int del(trie *tri, char *c){
if(*c=='\n')
tri->nr_c--;
else if(del(tri->l[*c-'a'],c+1))
tri->fii--, tri->l[*c-'a']=0;
if(tri->nr_c==0 && tri->fii==0 && tri!=t){
delete tri; return 1;
}
return 0;
}
int cuvant(trie *tri, char *c){
if(*c=='\n')
return tri->nr_c;
if(tri->l[*c-'a']!=0)
return cuvant(tri->l[*c-'a'], c+1);
return 0;
}
int prefix(trie *tri, char *c, int k){
if(*c=='\n' || tri->l[*c-'a']==0)
return k;
return prefix(tri->l[*c-'a'], c+1, k+1);
}
int main(){
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
char c[25];
while(!feof(stdin)){
switch(c[0]){
case '0': insert(t, c+2); break;
case '1': del(t, c+2); break;
case '2': cout<<cuvant(t,c+2)<<'\n'; break;
case '3': cout<<prefix(t,c+2,0)<<'\n'; break;
}
fgets(c,25,stdin);
}
}