Pagini recente » Cod sursa (job #261960) | Cod sursa (job #1308682) | Cod sursa (job #1038960) | Cod sursa (job #2259179) | Cod sursa (job #1535088)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXL 30
using namespace std;
char s[MAXL], *p;
int op;
struct nod
{
int nct, nrfii;
nod* fiu[30];
nod(int nr = 0)
{
nct = nr;
nrfii = 0;
for (int i = 0; i < 30; i++)
fiu[i] = NULL;
}
};
nod *root = new nod();
void citire()
{
p = strtok(s, ",. ;");
op = atoi(p);
p = strtok(NULL, ",. ;");
strcpy(s, p);
}
void insertion(nod *crt = root, int ind = 0)
{
if (!s[ind])
{
crt->nct++;
return;
}
int let = s[ind] - 'a';
if (crt->fiu[let] == NULL) {
crt->fiu[let] = new nod();
crt->nrfii++;
}
insertion(crt->fiu[let], ind+1);
}
int deletion(nod *crt = root, int ind = 0)
{
if (!s[ind])
crt->nct--;
else {
int let = s[ind] - 'a';
if (deletion(crt->fiu[let], ind+1)) {
crt->fiu[let] = NULL;
crt->nrfii--;
}
}
if (crt->nrfii == 0 && crt->nct == 0) {
delete crt;
return 1;
}
return 0;
}
int numberOfAparitions(nod *crt = root, int ind = 0)
{
if (!s[ind])
return crt->nct;
int let = s[ind] - 'a';
if (crt->fiu[let] != NULL)
return numberOfAparitions(crt->fiu[let], ind+1);
return 0;
}
int bestPrefix(nod *crt = root, int ind = 0)
{
if (!s[ind])
return ind;
int let = s[ind] - 'a';
if (crt->fiu[let] != NULL)
return bestPrefix(crt->fiu[let], ind+1);
return ind;
}
void update()
{
if (op == 0)
insertion();
else if (op == 1)
deletion();
else if (op == 2)
cout << numberOfAparitions() << "\n";
else if (op == 3)
cout << bestPrefix() << "\n";
else
cerr << "ERROR update\n";
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
while(!feof(stdin)) {
gets(s);
if (!s[0]) break;
citire();
update();
memset(s, 0, sizeof(s));
}
return 0;
}