Pagini recente » Cod sursa (job #2824678) | Cod sursa (job #2532145) | Cod sursa (job #376237) | Cod sursa (job #1695473) | Cod sursa (job #2126545)
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct nod
{
int inf;
int last;
nod *f[30];
nod()
{
inf=0;
last=0;
memset(f,0,sizeof(f));
}
};
nod *root, *aux, *q;
int op,lg;
char s[22];
void ins ()
{
q=root;
lg=strlen(s);
for(int i=0; i<lg; i++)
{
if(!q->f[s[i]-'a'])
{
aux=new nod;
q->f[s[i]-'a']=aux;
}
q=q->f[s[i]-'a'];
q->inf++;
q->last+=(i==lg-1);
}
}
void elim (int i, nod *q)
{
q->f[s[i]-'a']->inf--;
if(i+1==lg-1) q->f[s[i]-'a']->last--;
else elim(i+1,q->f[s[i]-'a']);
if(q->f[s[i]-'a']->inf==0)
q->f[s[i]-'a']=0;
}
int ap ()
{
q=root;
lg=strlen(s);
for(int i=0; i<lg; i++)
{
if(!q->f[s[i]-'a']) return 0;
q=q->f[s[i]-'a'];
if(i==lg-1)
return q->last;
}
}
int pref ()
{
q=root;
lg=strlen(s);
for(int i=0; i<lg; i++)
{
if(!q->f[s[i]-'a']) return q->inf+1;
q=q->f[s[i]-'a'];
if(i==lg-1)
return q->inf;
}
}
int main()
{
root=new nod;
while(in>>op,in.get(),in>>s)
{
if(op==0)
ins();
else if(op==1)
{
lg=strlen(s);
elim(0,root);
}
else if(op==2)
out<<ap()<<'\n';
else if(op==3)
out<<pref()<<'\n';
}
return 0;
}