Pagini recente » Cod sursa (job #766652) | Cod sursa (job #1035901) | Cod sursa (job #769385) | Cod sursa (job #323966) | Cod sursa (job #3348898)
#include <fstream>
using namespace std;
const int nmax = 1e5 + 5;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie {
int cnt, son;
trie* v[30];
trie() {
cnt = son = 0;
for (int i = 0; i <= 26; i++) v[i] = nullptr;
}
};
trie* root;
void add(string s, int ind, trie* node)
{
if (ind >= s.size()) {
node->cnt++;
return;
}
int x = s[ind] - 'a';
if (!node->v[x]) node->v[x] = new trie(), node->son++;
add(s, ind + 1, node->v[x]);
}
bool del(string s, int ind, trie* node)
{
if (ind >= s.size())
{
node->cnt--;
if (!node->cnt && !node->son && node != root) {
delete node;
return true;
}
return false;
}
int x = s[ind] - 'a';
if (!node->v[x]) return false;
if(del(s, ind + 1, node->v[x]))
node->son--, node->v[x] = nullptr;
if (!node->cnt && !node->son && node != root) {
delete node;
return true;
}
return false;
}
int number(string s, int ind, trie* node)
{
if (ind >= s.size()) return node->cnt;
int x = s[ind] - 'a';
if (!node->v[x]) return 0;
return number(s, ind + 1, node->v[x]);
}
int pref(string s, int ind, trie* node)
{
if (ind >= s.size()) return s.size();
int x = s[ind] - 'a';
if (!node->v[x]) return ind;
return pref(s, ind + 1, node->v[x]);
}
int main()
{
int tip; string s; root = new trie();
while (f >> tip >> s)
if (tip == 0) add(s, 0, root);
else if (tip == 1) del(s, 0, root);
else if (tip == 2) g << number(s, 0, root) << '\n';
else g << pref(s, 0, root) << '\n';
return 0;
}