Pagini recente » Cod sursa (job #2886260) | Cod sursa (job #2538018) | Cod sursa (job #138180) | Cod sursa (job #478658) | Cod sursa (job #2300198)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie{
int nr, sons;
Trie *fii[26];
Trie(){
nr = sons = 0;
memset(fii, 0, sizeof(fii));
}
};
Trie *T;
string s;
void Add(Trie *&nod,int k)
{
if(nod == NULL)
nod = new Trie();
if(k == s.size())
{
nod->nr++;
return;
}
nod->sons++;
Add(nod->fii[(s[k]-'a')], k+1);
}
bool Delete(Trie *&nod, int k)
{
if(k == s.size())
{
nod->nr--;
}
else
{
nod->sons--;
Delete(nod->fii[(s[k]-'a')], k+1);
}
if(nod->nr == 0 && nod->sons == 0)
{
delete nod; nod = NULL;
}
}
int Query(Trie *&nod, int k)
{
if(nod == NULL)
return 0;
if(k == s.size())
{
return nod->nr;
}
return Query(nod->fii[(s[k]-'a')], k+1);
}
int Prefix(Trie *&nod, int k)
{
if(k == s.size())
return k;
if(nod->fii[(s[k]-'a')] != NULL && (nod->fii[s[k]-'a']->nr || nod->fii[s[k]-'a']->sons ))
return Prefix(nod->fii[(s[k]-'a')], k+1);
return k;
}
int main()
{
short w;
T = new Trie();
while(fin>>w>>s)
{
if(w == 0)
Add(T, 0);
else
if(w == 1)
Delete(T, 0);
else
if(w == 2)
fout << Query(T, 0) << '\n';
else
fout << Prefix(T, 0) << '\n';
}
return 0;
}