Pagini recente » Cod sursa (job #2875077) | Cod sursa (job #185462) | Cod sursa (job #3249655) | Cod sursa (job #2902626) | Cod sursa (job #2053038)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
typedef struct nod{
struct nod *fiu[28]; int terminal, nrf;
} NOD, *TRIE;
TRIE T = NULL;
int v, maxim, best;
char cuv[25], *p1;
void adauga(TRIE &T, char *p)
{
if(T == 0)
{
T = new NOD;
for(int i = 0; i <= 25; ++i)
T->fiu[i] = 0;
T->nrf = 0;
T->terminal = 0;
adauga(T, p);
}
else
{
T->nrf++;
if(*p == '\0')T->terminal ++;
else adauga(T->fiu[*p - 'a'], p + 1);
}
}
bool sterge(TRIE &T, char *p)
{
int x = *p - 'a';
if(*p == '\0')
T -> terminal--;
else if(sterge(T->fiu[x], p + 1))
{
T->fiu[x] = 0;
T->nrf--;
}
if(T->nrf == 0 && T->terminal == 0)
{
delete(T);
return 1;
}
return 0;
}
int nrapr(TRIE &T, char *p)
{
int x = *p - 'a';
if(*p == '\0')return T->terminal;
if(T->fiu[x] == 0)return 0;
return nrapr(T->fiu[x], p + 1);
}
void cautpr(TRIE &T, char *p)
{
if(T == NULL)
{
fout << best - 1 << '\n';
return;
}
if(T -> nrf >= 1)best++;
if((*p) == '\0')
{
fout << best - 1<< '\n';
}
else
cautpr(T->fiu[(*p) - 'a'], p + 1);
}
int main()
{
while(fin >> v)
{
fin >> cuv;
if(v == 0)adauga(T, cuv);
else if(v == 1)sterge(T, cuv);
else if(v == 2)fout << nrapr(T, cuv) << '\n';
else
{
best = 0;
cautpr(T, cuv);
}
}
return 0;
}