Pagini recente » Cod sursa (job #863381) | Cod sursa (job #682187) | Cod sursa (job #2210395) | Cod sursa (job #1340027) | Cod sursa (job #3276480)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int cnt, fii;
Trie* fiu[26];
Trie()
{
cnt = fii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie* T = new Trie;
void ins(Trie* node, string& s, int poz = 0)
{
if(poz == s.size())
{
node->cnt++;
return;
}
int id = s[poz] - 'a';
if(node->fiu[id] == nullptr)
{
node->fiu[id] = new Trie;
node->fii++;
}
ins(node->fiu[id], s, poz + 1);
}
bool del(Trie* node, string& s, int poz = 0)
{
int id = s[poz] - 'a';
if(poz == s.size())
node->cnt--;
else if(del(node->fiu[id], s, poz + 1))
{
node->fiu[id] = nullptr;
node->fii--;
}
if(node->cnt == 0 && node->fii == 0 && node != T)
{
delete node;
return true;
}
return false;
}
int query(Trie* node, string& s, int poz = 0)
{
int id = s[poz] - 'a';
if(poz == s.size())
return node->cnt;
if(node->fiu[id] != nullptr)
return query(node->fiu[id], s, poz + 1);
return 0;
}
int prefix(Trie* node, string& s, int poz = 0, int k = 0)
{
int id = s[poz] - 'a';
if(poz == s.size() || node->fiu[id] == nullptr)
return k;
return prefix(node->fiu[id], s, poz + 1, k + 1);
}
signed main()
{
int cer;
string s;
while(fin >> cer >> s)
{
if(cer == 0)
ins(T, s);
else if(cer == 1)
del(T, s);
else if(cer == 2)
fout << query(T, s) << "\n";
else
fout << prefix(T, s) << "\n";
}
return 0;
}