Pagini recente » Cod sursa (job #1638113) | Cod sursa (job #1671040) | Cod sursa (job #1068322) | Cod sursa (job #617971) | Cod sursa (job #3337817)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int type;
string s;
struct node
{
int kids,value;
node *l[26]{};
node(): kids(0),value(0) {}
}*root;
bool delete_condition(node *nod)
{
return nod!=root && nod->value==0 && nod->kids==0;
}
void add(node *root, int depth)
{
if (depth==s.size())
root->value++;
else
{
int letter=s[depth]-'a';
if (root->l[letter]==NULL)
{
root->l[letter]=new node();
root->kids++;
}
add(root->l[letter],depth+1);
}
}
int nr_strings(node *root, int depth)
{
if (depth==s.size())
return root->value;
else
{
int letter=s[depth]-'a';
if (root->l[letter]==NULL)
return 0;
else
return nr_strings(root->l[letter],depth+1);
}
}
int longest_prefix(node *root, int depth)
{
if (depth==s.size())
return depth;
else
{
int letter=s[depth]-'a';
if (root->l[letter]==NULL)
return depth;
else
return longest_prefix(root->l[letter],depth+1);
}
}
bool del(node *root, int depth)
{
if (depth==s.size())
{
root->value--;
bool ans=delete_condition(root);
if (ans)
delete root;
return ans;
}
else
{
bool ans=0;
int letter=s[depth]-'a';
bool deleted=del(root->l[letter],depth+1);
if (deleted)
{
root->l[letter]=NULL;
root->kids--;
if (delete_condition(root))
{
ans=1;
delete root;
}
}
return ans;
}
}
int main()
{
ios_base::sync_with_stdio(false);
fin.tie(nullptr); fout.tie(nullptr);
root=new node();
while (fin>>type>>s)
{
if (type==0)
add(root,0);
if (type==1)
del(root,0);
if (type==2)
fout<<nr_strings(root,0)<<'\n';
if (type==3)
fout<<longest_prefix(root,0)<<'\n';
}
return 0;
}