Pagini recente » Borderou de evaluare (job #2487119) | Cod sursa (job #2627193) | Cod sursa (job #899878) | Cod sursa (job #1670506) | Cod sursa (job #2634910)
#include<bits/stdc++.h>
#define CH (*s - 'a')
using namespace std;
struct Trie{
int cnt,nr_fii;
Trie *fiu[26];
Trie(){
cnt=nr_fii=0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie *T=new Trie;
void add(Trie *nod, char *s){
if(*s=='\n'){
nod->cnt++;
return;
}
if(nod->fiu[CH]==0) {
nod->fiu[CH]=new Trie;
nod->nr_fii++;
}
add(nod->fiu[CH], s+1);
}
int del(Trie *nod, char *s){
if(*s=='\n')
nod->cnt--;
else if(del(nod->fiu[CH], s+1)){
nod->fiu[ CH ]=0;
nod->nr_fii--;
}
if(nod->cnt==0 && nod->nr_fii==0 && nod!=T){
delete nod;
return 1;
}
return 0;
}
int nrap(Trie *nod, char *s){
if(*s=='\n')
return nod->cnt;
if(nod->fiu[CH])
return nrap(nod->fiu[CH], s+1);
return 0;
}
int prefix(Trie *nod, char *s, int k){
if(*s=='\n' || nod->fiu[CH]==0)
return k;
return prefix(nod->fiu[CH], s+1, k+1);
}
int main(){
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
char line[32];
fgets(line, 32, stdin);
while(!feof(stdin)){
if(line[0]=='0')
add(T, line+2);
else if(line[0]=='1')
del(T, line+2);
else if(line[0]=='2')
printf("%d\n", nrap(T, line+2));
else if(line[0]=='3')
printf("%d\n", prefix(T, line+2, 0));
fgets(line, 32, stdin);
}
return 0;
}