Pagini recente » Cod sursa (job #2512137) | Cod sursa (job #1709408) | Cod sursa (job #1669621) | Cod sursa (job #1731522) | Cod sursa (job #1216721)
#include <iostream>
#include <fstream>
using namespace std;
ifstream ka("trie.in");
ofstream ki("trie.out");
struct nod
{
int aparitii, urmatoare;
nod* fii[26];
nod* precedent;
nod() {
aparitii = 0;
urmatoare = 0;
for(int i = 0; i < 26; i++)
fii[i] = NULL;
precedent = NULL;
}
};
void stergere(string s, int poz, nod* n)
{
if(poz >= 0 && n->urmatoare == 0)
{
n->precedent->fii[s[poz]- 'a'] = NULL;
stergere(s, poz - 1, n->precedent);
delete n;
}
}
void adaugare(string s, int poz, nod* n, int a)
{
if(a == 0)
n->urmatoare++;
else if(a == 1)
n->urmatoare--;
if(poz == s.size())
{
if(a == 0)
n->aparitii++;
else if(a == 1)
{
n->aparitii--;
if(n->aparitii == 0)
{
stergere(s, poz, n);
}
}
else if(a == 2)
ki << n->aparitii << '\n';
}
else if(n->fii[s[poz]-'a'] != NULL)
{
adaugare(s, poz + 1, n->fii[s[poz]-'a'], a);
}
else
{
if(a == 0)
{
nod* nn = new nod;
nn->precedent = n;
n->fii[s[poz]-'a'] = nn;
adaugare(s, poz + 1, n->fii[s[poz]-'a'], a);
}
else if(a == 2)
ki << 0 << '\n';
}
}
void prefix(string s, int poz, nod* n)
{
if(n->fii[s[poz]-'a'] != NULL)
prefix(s, poz + 1, n->fii[s[poz]-'a']);
else
ki << poz << '\n';
}
int main()
{
int a;
string s;
nod* radacina = new(nod);
while(ka >> a >> s)
{
if(a == 0)
{
adaugare(s, 0, radacina, 0);
}
else if(a == 1)
{
adaugare(s, 0, radacina, 1);
}
else if(a == 2)
{
adaugare(s, 0, radacina, 2);
}
else
{
prefix(s, 0, radacina);
}
}
}