Pagini recente » Cod sursa (job #2803125) | Cod sursa (job #606604) | Cod sursa (job #69722) | Cod sursa (job #2118008) | Cod sursa (job #2725905)
#include <bits/stdc++.h>
using namespace std;
typedef struct Trie* trie;
struct Trie
{
int apar = 0, term = 0;
trie adr[26];
};
trie Vf = new Trie();
void adauga(string cuv)
{
trie poz = Vf;
for(auto lit:cuv)
{
if(poz -> adr[lit - 'a'] == NULL)
{
trie newRam = new Trie();
poz -> adr[lit - 'a'] = newRam;
}
poz = poz -> adr[lit - 'a'];
poz -> apar++;
}
poz -> term++;
}
void sterge(string cuv)
{
stack < pair <trie, char> > s;
s.push({Vf, 'a'});
trie poz = Vf;
cuv.push_back('a');
for(int i = 0; i < cuv.size() - 1; i++)
if(poz -> adr[cuv[i] - 'a'] == NULL)
return;
else
{
poz = poz -> adr[cuv[i] - 'a'];
s.push({poz, cuv[i]});
}
poz -> term--;
bool do_it = true;
while(s.size() > 1)
{
poz = s.top().first;
char lit = s.top().second - 'a';
s.pop();
poz -> apar--;
if(poz -> apar == 0 && do_it)
s.top().first -> adr[lit] = NULL;
else
do_it = false;
}
}
int aparitii(string cuv)
{
trie poz = Vf;
for(auto lit:cuv)
if(poz -> adr[lit - 'a'] == NULL)
return 0;
else
poz = poz -> adr[lit - 'a'];
return poz -> term;
}
int prefix(string cuv)
{
int lung = 0;
trie poz = Vf;
for(auto lit:cuv)
if(poz -> adr[lit - 'a'] == NULL)
return lung;
else
{
lung++;
poz = poz -> adr[lit - 'a'];
}
return lung;
}
ifstream fin("trie.in");
ofstream fout("trie.out");
int c;
string cuv;
int main()
{
while(fin >> c)
{
fin >> cuv;
switch(c)
{
case 0: adauga(cuv); break;
case 1: sterge(cuv); break;
case 2: fout << aparitii(cuv) << '\n'; break;
case 3: fout << prefix(cuv) << '\n'; break;
}
}
return 0;
}