Pagini recente » Cod sursa (job #1553716) | Cod sursa (job #1831074) | Cod sursa (job #349573) | Cod sursa (job #348795) | Cod sursa (job #645054)
Cod sursa(job #645054)
#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'];
}
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++;
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);
while(!feof(stdin)) {
fgets(str,32,stdin);
if(str[0] == '0')
inserare(T,str+2);
else
if(str[0] == '1') sterge(T,str+2);
else
printf("%d\n", str[0] == '2' ? query(T,str+2) : prefix(T,str+2));
}
return 0;
}