Pagini recente » Cod sursa (job #2492007) | Cod sursa (job #1793176) | Cod sursa (job #3172493) | Cod sursa (job #2140847) | Cod sursa (job #677343)
Cod sursa(job #677343)
#include <cstdio>
#include <cstring>
#define LT (*s - 'a')
using namespace std;
struct Trie
{
int cnt, nrFii;
Trie* fiu[26];
Trie()
{
cnt = nrFii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie *trie = new Trie;
void insert(Trie * nod, char* s)
{
if(*s == '\n')
{
nod->cnt++;
return;
}
if(!nod->fiu[ LT ])
{
nod->nrFii++;
nod->fiu[ LT ] = new Trie;
}
insert(nod->fiu[ LT ], s + 1);
}
int del(Trie * nod, char* s)
{
if(*s == '\n')
{
nod->cnt--;
}
else if(del(nod->fiu[ LT ], s + 1))
{
nod->fiu[ LT ] = 0;
nod->nrFii--;
}
if(!nod->cnt && !nod->nrFii)
{
delete nod;
return 1;
}
return 0;
}
int detAp(Trie * nod, char *s)
{
if(*s == '\n')
return nod->cnt;
if(nod -> fiu[ LT ])
return detAp(nod->fiu[ LT ], s + 1);
return 0;
}
int prefix(Trie * nod, char * s, int k)
{
if(*s == '\n' || !nod->fiu[ LT ])
{
return k;
}
return prefix(nod->fiu[ LT ], s + 1, k + 1);
}
int main()
{
char str[32];
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
fgets(str, 32, stdin);
while(!feof(stdin))
{
switch(str[0])
{
case '0': insert(trie, str + 2); break;
case '1': del(trie, str + 2); break;
case '2': printf("%d\n",detAp(trie, str + 2)); break;
case '3': printf("%d\n",prefix(trie, str + 2, 0)); break;
}
fgets(str, 32, stdin);
}
return 0;
}