Pagini recente » Cod sursa (job #3208041) | Cod sursa (job #2541625) | Cod sursa (job #1832433) | Cod sursa (job #1834841) | Cod sursa (job #3274750)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
class Trie{
int cnt=0, lf=0;
Trie *next[27]={};
public:
void insert(int i, char s[])
{
++lf;
if(i==strlen(s))
cnt++;
else
{
if(!next[s[i]-'a'])
next[s[i]-'a']=new Trie;
next[s[i]-'a']->insert(i+1, s);
}
}
void erase(int i, char s[])
{
--lf;
if(i==strlen(s))
--cnt;
else
{
next[s[i]-'a']->erase(i+1, s);
if(!next[s[i]-'a']->lf)
{
delete next[s[i]-'a'];
next[s[i]-'a']=nullptr;
}
}
}
int fr(int i, char s[])
{
if(i==strlen(s))
return cnt;
if(!next[s[i]-'a'])
return 0;
return next[s[i]-'a']->fr(i+1, s);
}
int prefix(int i, char s[])
{
if(i==strlen(s))
return 0;
if(!next[s[i]-'a'])
return 0;
return 1+next[s[i]-'a']->prefix(i+1, s);
}
};
Trie a;
int c;
char s[22];
int main()
{
while(fin>>c>>s)
{
if(c==0)
a.insert(0,s);
if(c==1)
a.erase(0,s);
if(c==2)
fout<<a.fr(0, s)<<'\n';
if(c==3)
fout<<a.prefix(0,s)<<'\n';
}
return 0;
}