Pagini recente » Cod sursa (job #1610119) | Cod sursa (job #1957042) | Cod sursa (job #1312249) | Cod sursa (job #1783132) | Cod sursa (job #290636)
Cod sursa(job #290636)
#include<cstdio>
#include<cstring>
using namespace std;
#define C (*s - 'a')
struct Trie
{
int cnt, nrfii;
Trie *fiu[26];
Trie()
{
cnt = nrfii = 0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T=new Trie;
void adauga(Trie *nod, char *s)
{
if(*s=='\n')
{
nod->cnt ++;
return;
}
if(!nod->fiu[ C ])
{
nod->nrfii ++;
nod->fiu [ C ] = new Trie;
}
adauga(nod->fiu[ C ], s+1);
}
int sterge(Trie *nod, char *s)
{
if(*s == '\n')
{
nod->cnt --;
}
else if(sterge(nod->fiu[C],s+1))
{
nod->nrfii-- ; nod->fiu[C] = 0;
}
if(nod->cnt == 0 && nod->nrfii == 0 && nod != T)
{
delete(nod);
return 1;
}
return 0;
}
int query(Trie *nod, char *s)
{
if(*s=='\n') return nod->cnt;
if(nod->fiu[C]) return query(nod->fiu[C],s+1);
return 0;
}
int prefix(Trie *nod, char *s, int k)
{
if(*s=='\n' || nod->fiu[C]==0 ) return k;
return prefix(nod->fiu[C], s+1, k+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
char s[32];
fgets(s,32,stdin);
while(!feof(stdin))
{
if(s[0] == '0') adauga(T,s+2);
else if(s[0]=='1') sterge(T,s+2);
else if(s[0]=='2') printf("%d\n",query(T,s+2));
else printf("%d\n",prefix(T,s+2,0));
fgets(s,32,stdin);
}
return 0;
}