Pagini recente » Cod sursa (job #95907) | Cod sursa (job #3216316) | Cod sursa (job #3283193) | Cod sursa (job #114257) | Cod sursa (job #3238669)
#include <fstream>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
struct TRIE
{
struct Nod
{
Nod* copil[26];
int nrfii = 0, nrcuv = 0, sfarsit = 0;
Nod()
{
nrfii = nrcuv = sfarsit = 0;
for(int i = 0; i < 26; i ++)
copil[i] = NULL;
}
};
Nod* radacina = new Nod();
void insert(string s, int poz, Nod* nod)
{
if(poz == s.size())
{
nod -> nrcuv ++;
return;
}
int lit = s[poz] - 'a';
if(nod -> copil[lit] == NULL)
nod -> copil[lit] = new Nod();
nod = nod->copil[lit];
nod -> nrfii ++;
insert(s, poz + 1, nod);
}
void erase(string s, int poz, Nod* nod)
{
if(poz == s.size())
{
nod -> nrfii --;
nod -> nrcuv --;
return;
}
int lit = s[poz] - 'a';
nod -> nrfii --;
nod = nod -> copil[lit];
erase(s, poz + 1, nod);
}
int count(string s, int poz, Nod* nod)
{
for (int i = 0; i < s.size(); i ++)
{
int lit = s[i] - 'a';
if(nod -> copil[lit] == NULL)
return 0;
nod = nod -> copil[lit];
}
return nod -> nrcuv;
}
int longest_prefix(string s, int poz, Nod* nod)
{
if(poz == s.size())
return 0;
int lit = s[poz] - 'a';
if(nod -> copil[lit] == NULL || nod -> copil[lit] -> nrfii == 0)
return 0;
return 1 + longest_prefix(s, poz + 1, nod -> copil[lit]);
}
} trie;
int main()
{
int t;
string s;
while(cin >> t >> s)
{
if(t == 0)//adun
trie.insert(s, 0, trie.radacina);
else if (t == 1)//scad
trie.erase(s, 0, trie.radacina);
else if (t == 2)//de cate ori apare
cout << trie.count(s, 0, trie.radacina) << '\n';
else
cout << trie.longest_prefix(s, 0, trie.radacina) << '\n';
}
return 0;
}