Pagini recente » Cod sursa (job #2767307) | Cod sursa (job #1241474) | Cod sursa (job #1633315) | Cod sursa (job #2595195) | Cod sursa (job #804662)
Cod sursa(job #804662)
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie{
int cnt;
int nrfii;
Trie *fiu[26];
Trie(){
cnt = nrfii = 0;
memset(fiu, 0, sizeof(fiu));
}
} *T = new Trie;
void add(Trie *nod, char *w)
{
printf("%s", w);
if(*w == '\n')
{
nod->cnt++;
return;
}
if(nod->fiu[*w - 'a'] == 0)
{
nod->fiu[*w - 'a'] = new Trie;
nod->nrfii++;
}
add(nod->fiu[*w - 'a'], w + 1);
}
int sterge(Trie *nod, char *w)
{
if(*w == '\n')
{
nod->cnt--;
}
else
if(sterge( nod->fiu[*w - 'a'], w + 1) == 1)
{
nod->fiu[*w - 'a'] = 0;
nod->nrfii--;
}
if(nod->cnt == 0 && nod->nrfii == 0 && nod != T)
{
delete nod;
return 1;
}
return 0;
}
int count(Trie *nod, char *w)
{
if(*w == '\n')
return nod->cnt;
else
if(nod->fiu[*w - 'a'])
return count(nod->fiu[*w - 'a'], w + 1);
else return 0;
}
int prefix(Trie *nod, char *w, int k)
{
if(*w == '\n' || nod->fiu[*w - 'a'] == 0)
return k;
return prefix(nod->fiu[*w - 'a'], w + 1, k + 1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int nr;
char s[32];
while(!feof(stdin))
{
scanf("%d %s", &nr, s);
if(nr == 0)
add(T, s);
if(nr == 1)
sterge(T, s);
if(nr == 2)
printf("%d\n", count(T, s));
if(nr == 3)
printf("%d\n", prefix(T, s, 0));
}
return 0;
}