Pagini recente » Cod sursa (job #1591218) | Cod sursa (job #3260842) | Cod sursa (job #2486103) | Cod sursa (job #1953533) | Cod sursa (job #2487132)
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int contor = 0;
unordered_map<char, Node*> copil;
} *trie = new Node;
void adauga(char* cuvant)
{
Node* aux = trie;
for(int i = 0; cuvant[i] != '\0'; ++i)
{
char caracter = cuvant[i];
if(aux->copil.find(caracter) == aux->copil.end())
aux->copil.insert({caracter, new Node});
aux = aux->copil.at(caracter);
}
aux->contor++;
}
Node* sterge(char* cuvant, Node* nod = trie)
{
char caracter = cuvant[0];
if(caracter == '\0')
{
nod->contor--;
return nod;
}
nod->copil.at(caracter) = sterge(cuvant + 1, nod->copil.at(caracter));
if(nod->copil.at(caracter)->contor == 0 && nod->copil.at(caracter)->copil.size() == 0) nod->copil.erase(caracter);
return nod;
}
int numar_aparitii(char* cuvant)
{
Node* aux = trie;
for(int i = 0; cuvant[i] != '\0'; ++i)
{
char caracter = cuvant[i];
if(aux->copil.find(caracter) == aux->copil.end())
return 0;
aux = aux->copil.at(caracter);
}
return aux->contor;
}
int lungime_maxima_prefix(char* cuvant)
{
Node* aux = trie;
int i;
for(i = 0; cuvant[i] != '\0'; ++i)
{
char caracter = cuvant[i];
if(aux->copil.find(caracter) == aux->copil.end())
return i;
aux = aux->copil.at(caracter);
}
return i;
}
int main()
{
ifstream fin("trie.in");
ofstream fout("trie.out");
int op;
char* cuvant = new char[21];
while(fin >> op >> cuvant)
{
switch(op)
{
case 0:
adauga(cuvant);
break;
case 1:
sterge(cuvant);
break;
case 2:
fout << numar_aparitii(cuvant) << '\n';
break;
case 3:
fout << lungime_maxima_prefix(cuvant) << '\n';
break;
}
}
}