Pagini recente » Clasament FMI No Stress 5 | Cod sursa (job #504044) | Cod sursa (job #692443) | Cod sursa (job #710828) | Cod sursa (job #2802425)
#include <bits/stdc++.h>
#define int long long
#define dim 200006
#define mod 666013//1000000007
using namespace std;
ifstream fin ("trie.in");
ofstream fout("trie.out");
string s;
struct trie
{
int nrc=0,ap=0;
trie *kids[29];
trie ()
{
for (int i=0;i<=26;i++)
kids[i]=nullptr;
}
};
trie* insert (trie *node,int index)
{
if (node==nullptr)
node=new trie;
node->ap++;
if (index==(int)s.size())
{
node->nrc++;
return node;
}
node->kids[s[index]-'a']=insert(node->kids[s[index]-'a'],index+1);
return node;
}
trie* sterge (trie *node,int index)
{
node->ap--;
if (index==(int)s.size())
node->nrc--;
else
node->kids[s[index]-'a']=sterge(node->kids[s[index]-'a'],index+1);
if (node->ap==0)
node=nullptr;
return node;
}
int numara (trie *node,int index)
{
if (node==nullptr)
return 0;
if (index==(int)s.size())
return node->nrc;
return numara(node->kids[s[index]-'a'],index+1);
}
int bestpref(trie *node,int index)
{
if (node==nullptr)
return -1;
if (index==(int)s.size())
return 0;
return 1+bestpref(node->kids[s[index]-'a'],index+1);
}
int32_t main()
{
int t;
trie *root=nullptr;
while (fin>>t>>s)
{
if (t==0)
root=insert(root,0);
else if (t==1)
root=sterge(root,0);
else if (t==2)
fout<<numara(root,0)<<'\n';
else fout<<bestpref(root,0)<<'\n';
}
return 0;
}