Pagini recente » Cod sursa (job #3242174) | Cod sursa (job #2685601) | Cod sursa (job #1465051) | Cod sursa (job #3185161) | Cod sursa (job #1216578)
#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;
};
void stergere(string s, nod* n, int poz)
{
n->urmatoare--;
bool bun = false;
for(int i = 0; i < 26 && !bun; i++)
if(n->fii[i] != NULL)
bun = true;
if(!bun && n->aparitii == 0)
{
stergere(s, n->precedent, poz - 1);
}
}
void adaugare(string s, int poz, nod* n, int a)
{
if(poz == s.size())
{
if(a == 0)
n->aparitii++;
else if(a == 1)
{
n->aparitii--;
if(n->aparitii == 0)
{
stergere(s, n->precedent, poz-1);
}
}
else if(a == 2)
ki << n->aparitii << '\n';
}
else if(n->fii[s[poz]-'a'] != NULL)
{
if(a == 0)
n->urmatoare++;
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;
n->urmatoare++;
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)
{
int continuari = 0;
if(n->urmatoare == 1)
ki << poz << '\n';
else 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);
}
}
}