Pagini recente » Cod sursa (job #1949041) | Cod sursa (job #1821438) | Cod sursa (job #2431826) | Cod sursa (job #2645421) | Cod sursa (job #1862058)
#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 ins(Trie *nod, char *s)
{
if(*s == '\n')
{
nod->cnt++;
return;
}
if(!nod->fiu[C])
{
nod->fiu[C] = new Trie;
nod->nrfii++;
}
ins(nod->fiu[C], s+1);
}
bool del(Trie *nod, char *s)
{
if(*s == '\n')
nod->cnt--;
else if(del(nod->fiu[C], s+1))
{
nod->fiu[C] = 0;
nod->nrfii--;
}
if(!nod->cnt && !nod->nrfii && nod != t)
{
delete nod;
return 1;
}
return 0;
}
int count(Trie *nod, char *s)
{
if(*s == '\n')
return nod->cnt;
return count(nod->fiu[C], s+1);
}
int pref(Trie *nod, char *s, int k)
{
if(*s == '\n' || !nod->fiu[C])
return k;
return pref(nod->fiu[C], s+1, k+1);
}
int main()
{
char linie[25];
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
fgets(linie, 25, stdin);
while(!feof(stdin))
{
switch(linie[0])
{
case '0': ins(t, linie+2);
break;
case '1': del(t, linie+2);
break;
case '2': printf("%d\n", count(t, linie+2));
break;
case '3': printf("%d\n", pref(t, linie+2, 0));
break;
}
fgets(linie, 25, stdin);
}
return 0;
}