Pagini recente » Cod sursa (job #1525220) | Cod sursa (job #661236) | Cod sursa (job #2726696) | Cod sursa (job #1929847) | Cod sursa (job #2698558)
#include <iostream>
#include <fstream>
#define CH(s) s-'a'
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int cnt, nrfii;
Trie* fiu[26];
};
Trie* T = new Trie();
void insereaza(Trie* nod, char* s)
{
if (*s == 0)
{
nod->cnt++;
return;
}
if (nod->fiu[CH(*s)] == NULL)
{
nod->fiu[CH(*s)] = new Trie();
nod->nrfii++;
}
insereaza(nod->fiu[CH(*s)], s + 1);
}
int sterge(Trie* nod, char* s)
{
if (*s == 0)
{
nod->cnt--;
}
else if (sterge(nod->fiu[CH(*s)], s + 1))
{
nod->fiu[CH(*s)] = NULL;
nod->nrfii--;
}
if (nod->cnt == 0 && nod->nrfii == 0 && nod != T)
{
delete nod;
return 1;
}
return 0;
}
int aparitii(Trie* nod, char* s)
{
if (*s == 0)
return nod->cnt;
if (nod->fiu[CH(*s)])return aparitii(nod->fiu[CH(*s)], s + 1);
return 0;
}
int lungmax(Trie* nod, char* s, int k)
{
if (*s == 0 || nod->fiu[CH(*s)] == NULL)
return k;
else return lungmax(nod->fiu[CH(*s)], s + 1, k + 1);
}
int main()
{
char line[32];
fin.getline(line, 32);
while (!fin.eof())
{
switch (line[0])
{
case '0': insereaza(T, line + 2); break;
case '1': sterge(T, line + 2); break;
case '2': fout << aparitii(T, line + 2) << '\n'; break;
case '3': fout << lungmax(T, line + 2, 0) << '\n'; break;
}
fin.getline(line, 32);
}
}