Pagini recente » Cod sursa (job #529951) | Cod sursa (job #361835) | Cod sursa (job #3160479) | Cod sursa (job #2070126) | Cod sursa (job #719068)
Cod sursa(job #719068)
#include <cstdio>
#include <cstring>
#define max(a, b) ((a > b) ? a : b)
using namespace std;
class trie{
public:
trie *a[26];
int nr;
int nrFii;
trie(){
nr = 0;
nrFii = 0;
memset (a, 0, sizeof(a));
}
}*r;
int prefixMax;
void adauga (trie *&r, char *q){
if (r == NULL){
r = new trie;
}
if (q[0] == 0){
r -> nr ++;
return;
}
r -> nrFii ++;
adauga (r -> a[q[0] - 'a'], q + 1);
}
int sterge (trie *&r, char *q)
{
if (q[0] == 0){
r -> nr --;
if (r -> nrFii == 0 && r -> nr == 0){
delete r;
return 1;
}
return 0;
}
r -> nrFii --;
if (sterge (r -> a[q[0] -'a'], q + 1)){
r -> a[q[0] - 'a'] = 0;
}
if (r -> nrFii == 0 && r -> nr == 0){
delete r;
return 1;
}
return 0;
}
void aparitii (trie *&r, char *q)
{
if (q[0] == 0 || r == NULL){
if (r == NULL){
printf ("0\n");
return;
}
printf ("%d\n", r -> nr);
return;
}
aparitii (r -> a[q[0] - 'a'], q + 1);
}
void prefix (trie *&r, char *q, int nivel){
if (r == NULL){
return;
}
if (q[0] == 0){
if (r -> nr > 1 || r -> nrFii > 0){
prefixMax = max (prefixMax, nivel);
}
return;
}
if (r -> nrFii > 0 || r -> nr > 0){
prefixMax = max (prefixMax, nivel);
}
prefix (r -> a[q[0] - 'a'], q + 1, nivel + 1);
}
void citire()
{
int caz;
int z;
while (scanf ("%d", &caz) == 1){
char q[30];
scanf ("%s", q);
switch (caz){
case 0:
adauga (r, q);
break;
case 1:
z = sterge (r, q);
break;
case 2:
aparitii (r, q);
break;
case 3:
prefixMax = 0;
prefix (r, q, 0);
printf ("%d\n", prefixMax);
//printf ("caz3\n");
break;
}
}
}
int main()
{
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
citire();
return 0;
}