Pagini recente » Cod sursa (job #1277310) | Cod sursa (job #1055851) | Cod sursa (job #1730044) | Cod sursa (job #77591) | Cod sursa (job #804175)
Cod sursa(job #804175)
#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));
}
};
char w[32];
Trie *T = new Trie;
void add(Trie *nod, char w[])
{
printf("%s", w);
if(w[0] == '/n')
{
nod->cnt++;
return;
}
if(!nod->fiu[*w - 'a'])
{
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--;
}
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;
while(!feof(stdin))
{
scanf("%d %s", &nr, w);
if(nr == 0)
add(T, w);
if(nr == 1)
sterge(T, w);
if(nr == 2)
printf("%d\n", count(T, w));
if(nr == 3)
printf("%d\n", prefix(T, w, 0));
}
return 0;
}