Pagini recente » Cod sursa (job #2194203) | Cod sursa (job #2433578) | Cod sursa (job #1864062) | Cod sursa (job #3191361) | Cod sursa (job #2461677)
#include <iostream>
#include <fstream>
#include <cstring>
#define Nmax 24
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int n, l;
string s;
int cuvinte;
struct trie{
int nrcuv;
int fr;
trie *fii[26];
trie()
{
fr=0;
nrcuv=0;
for (int i = 0; i < 26; i++) fii[i]=0;
};
};
trie *rad= new trie;
void adauga(trie *nod, int pc)
{
if (pc == l)
{
(nod->nrcuv)++;
return;
}
if (nod->fii[s[pc]-'a'] == 0)
{
nod->fii[s[pc]-'a'] = new trie;
(nod->fr)++;
}
adauga(nod->fii[s[pc]-'a'], pc+1);
}
bool sterge(trie *nod, int pc)
{
if (pc == l)
{
(nod->nrcuv)--;
}
else if (sterge(nod->fii[s[pc]-'a'], pc+1))
{
(nod->fr)--;
nod->fii[s[pc]-'a']=0;
}
if (nod -> fr == 0 && nod -> nrcuv == 0 && nod != rad)
{
delete nod;
return 1;
}
return 0;
}
int cauta(trie *nod, int pc)
{
if (pc == l) return nod->nrcuv;
else if (nod->fii[s[pc]-'a'] != 0)
return cauta(nod->fii[s[pc]-'a'], pc+1);
return 0;
}
int prefix(trie *nod, int pc)
{
if (pc == l || nod->fii[s[pc]-'a'] == 0) return pc;
return prefix(nod->fii[s[pc]-'a'], pc+1);
}
int main()
{
s.resize(30);
while (f >> n >> s)
{
// cout << n << " " << s << " " ;
l=s.size();
if (n == 0) adauga(rad, 0);
else if (n == 1) sterge(rad, 0);
else if (n == 2) g << cauta(rad, 0) << '\n';
else if (n == 3)g << prefix(rad, 0) << '\n';
// cout << '\n';
}
return 0;
}