Pagini recente » Cod sursa (job #2140718) | Cod sursa (job #2396664) | Cod sursa (job #2956702) | Cod sursa (job #1657844) | Cod sursa (job #2665637)
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct nod
{
int ap;
int nr;
nod *next[26];
nod ()
{
ap=nr=0;
for (int i=0;i<26;++i)
next[i]=nullptr;
}
};
nod *tre;
char s[30];
int cer;
static inline void update(nod *tre,char *word,int val,int rem)
{
if (rem==0)
{
tre->ap+=val;
return ;
}
int now=(int)(*word-'a');
if (tre->next[now]==nullptr)
{tre->next[now]=new nod; tre->nr++;}
update(tre->next[now],word+1,val,rem-1);
if (val==-1)
{
nod *son=tre->next[now];
if (son->ap==0&&son->nr==0)
{delete(son); tre->next[now]=nullptr; tre->nr--;}
}
return ;
}
static inline int query1(nod *tre,char *word,int rem)
{
if (rem==0)
return tre->ap;
int now=(int)(*word-'a');
if (tre->next[now]==nullptr)
return 0;
return query1(tre->next[now],word+1,rem-1);
}
static inline int query2(nod *tre,char *word,int rem,int lvl)
{
if (rem==0)
return lvl;
int now=(int)(*word-'a');
if (tre->next[now]==nullptr)
return lvl;
return query2(tre->next[now],word+1,rem-1,lvl+1);
}
int main()
{
ios_base::sync_with_stdio(NULL);
in.tie();
out.tie();
tre=new nod;
while (in>>cer>>(s+1))
{
if (cer==0)
update(tre,s+1,1,(int)strlen(s+1));
if (cer==1)
update(tre,s+1,-1,(int)strlen(s+1));
if (cer==2)
out<<query1(tre,s+1,(int)strlen(s+1))<<'\n';
if (cer==3)
out<<query2(tre,s+1,(int)strlen(s+1),0)<<'\n';
}
return 0;
}