Pagini recente » Cod sursa (job #631143) | Cod sursa (job #1506578) | Cod sursa (job #332158) | Cod sursa (job #683658) | Cod sursa (job #645056)
Cod sursa(job #645056)
#include <cstdio>
#include <cstring>
struct trie {
int nrfii , cnt; trie *fiu[26];
trie() {
memset(fiu,0,sizeof(fiu));
nrfii = cnt = 0;
}
};
char str[1<<5];
trie *T = new trie;
void inserare(trie *nod,char *s)
{
while(*s!='\n')
{
if(nod->fiu[*s - 'a'] == 0)
nod->fiu[*s - 'a'] = new trie , nod->nrfii++;
nod = nod->fiu[*s - 'a'] , s++;
}
nod->cnt++;
}
bool sterge(trie *nod,char *s)
{
if(*s=='\n') nod->cnt--;
else
if(sterge(nod->fiu[*s - 'a'],s+1))
nod->fiu[*s - 'a'] = 0 , nod->nrfii--;
if(nod->nrfii == 0 && nod->cnt == 0 && nod != T) {
delete nod; return 1;
}
return 0;
}
int prefix(trie *nod,char *s)
{
int ans = 0;
while(*s !='\n' && nod->fiu[*s - 'a'])
nod = nod->fiu[*s - 'a'] , ans++ , s++;
return ans;
}
int query(trie *nod,char *s)
{
if(*s=='\n') return nod->cnt;
if(nod->fiu[*s - 'a'])
return query(nod->fiu[*s - 'a'],s+1);
return 0;
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
fgets(str,32,stdin);
while(!feof(stdin)) {
if(str[0] == '0')
inserare(T,str+2);
else
if(str[0] == '1') sterge(T,str+2);
else
if(str[0] == '2') printf("%d\n", query(T,str+2));
else
if(str[0] == '3') printf("%d\n",prefix(T,str+2));
fgets(str,32,stdin);
}
return 0;
}