Pagini recente » Cod sursa (job #874661) | Cod sursa (job #314283) | Cod sursa (job #2112669) | Cod sursa (job #566903) | Cod sursa (job #1522416)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
#define cout fout
struct trie{
int fii = 0;
trie *fiu[26] = {0};
int nr = 0;
} *R;
void add(trie *nod, char cuv[])
{
if(cuv[0] == 0)
{
nod->nr++;
return;
}
if(nod->fiu[cuv[0] - 'a'] == 0)
{
nod->fii++;
nod->fiu[cuv[0] - 'a'] = new trie;
}
add(nod->fiu[cuv[0] - 'a'], cuv + 1);
}
void sterge(trie *nod, char cuv[])
{
if(cuv[0] == 0)
nod->nr--;
else
{
sterge(nod->fiu[cuv[0] - 'a'], cuv + 1);
if(nod->fiu[cuv[0] - 'a']->fii == 0 && nod->fiu[cuv[0] - 'a']->nr == 0)
{
delete nod->fiu[cuv[0] - 'a'];
nod->fiu[cuv[0] - 'a'] = 0;
nod->fii--;
}
}
return;
}
int nr_ap(trie *nod, char cuv[])
{
if(cuv[0] == 0)
return nod->nr;
if(nod->fiu[cuv[0] - 'a'] == 0)
return 0;
return nr_ap(nod->fiu[cuv[0] - 'a'], cuv + 1);
}
int prefix(trie *nod, char cuv[])
{
if(cuv[0] == 0)
return 0;
if(!nod->fiu[cuv[0] - 'a'])
return 0;
return 1 + prefix(nod->fiu[cuv[0] - 'a'], cuv + 1);
}
int main()
{
int t;
char cuv[30];
R = new trie;
while(fin >> t)
{
fin >> cuv;
if(t == 0)
{
add(R, cuv);
}
if(t == 1)
{
sterge(R, cuv);
}
if(t == 2)
{
cout << nr_ap(R, cuv) << "\n";
}
if(t == 3)
{
cout << prefix(R, cuv) << "\n";
}
}
}