Pagini recente » Cod sursa (job #1570682) | Cod sursa (job #739026) | Cod sursa (job #1726559) | Cod sursa (job #670724) | Cod sursa (job #2444110)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct nod{
nod *c[26];
int aparitii,prefixe;
nod() {
memset(c, 0, sizeof c);
aparitii = prefixe = 0;
}
}*radacina;
void adauga(nod *&actual,string s)
{
///cerr << s << "\n";
if (actual == NULL)
{
actual = new nod;
}
actual->prefixe++;
if(s.length() == 0) {
actual->aparitii++;
return;
}
adauga(actual->c[s[0] - 'a'], s.substr(1));
}
void sterge(nod *&actual,string s)
{
actual->prefixe--;
if (s.length() == 0)
{
actual->aparitii--;
} else
{
sterge(actual->c[s[0] - 'a'], s.substr(1));
}
if (actual->prefixe == 0 && actual != radacina) {
delete actual;
actual = NULL;
}
}
int cnt_aparitii(nod *&actual,string s)
{
if (actual == NULL)
{
return 0;
}
if (s.length() == 0)
{
return actual->aparitii;
}
return cnt_aparitii(actual->c[s[0] - 'a'], s.substr(1));
}
int cnt_prefix(nod *&actual,string s)
{
if (actual == NULL)
{
return -1;
}
if (s.length() == 0)
{
return 0;
}
return 1 + cnt_prefix(actual->c[s[0] - 'a'], s.substr(1));
}
int main()
{
int op;
string s;
while (in >> op >> s)
{
if (op == 0)
{
adauga(radacina,s);
}
if (op == 1)
{
sterge(radacina,s);
}
if (op == 2)
{
out << cnt_aparitii(radacina,s) << "\n";
}
if (op == 3)
{
out << cnt_prefix(radacina,s) << "\n";
}
}
return 0;
}