Pagini recente » Cod sursa (job #746129) | Cod sursa (job #1576680) | Cod sursa (job #2913324) | Cod sursa (job #2265766) | Cod sursa (job #2665645)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{
int ap,nr;
nod *urm[26];
nod ()
{
ap=nr=0;
for(int i=0; i<26; ++i)
urm[i]=nullptr;
}
};
nod *tre;
char s[30];
int cerinta;
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->urm[now]==nullptr)
{
tre->urm[now]=new nod;
tre->nr++;
}
update(tre->urm[now],word+1,val,rem-1);
if (val==-1)
{
nod *son=tre->urm[now];
if(son->ap==0 && son->nr==0)
{
delete(son);
tre->urm[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->urm[now]==nullptr)return 0;
return query1(tre->urm[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->urm[now]==nullptr)return lvl;
return query2(tre->urm[now],word+1,rem-1,lvl+1);
}
int main()
{
ios_base::sync_with_stdio(NULL);
f.tie();
g.tie();
tre=new nod;
while(f>>cerinta>>(s+1))
{
if(cerinta==0)update(tre,s+1,1,(int)strlen(s+1));
if(cerinta==1)update(tre,s+1,-1,(int)strlen(s+1));
if(cerinta==2)g<<query1(tre,s+1,(int)strlen(s+1))<<'\n';
if(cerinta==3)g<<query2(tre,s+1,(int)strlen(s+1),0)<<'\n';
}
return 0;
}