Pagini recente » Cod sursa (job #1439948) | Cod sursa (job #2824593) | Cod sursa (job #802630) | Cod sursa (job #1309070) | Cod sursa (job #2075061)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
struct nod
{
nod *fii[27];
int nrAparitii,nrFii;
nod()
{
for(int i=0; i<27; i++)
fii[i]=NULL;
nrAparitii=0;
nrFii=0;
}
}*root,*q;
void insertCuvant(char cuv[])
{
int l=strlen(cuv);
q=root;
for(int i=0; i<l; i++)
{
if(q->fii[cuv[i]-'a']==NULL)
{
q->fii[cuv[i]-'a']=new nod;
q->nrFii++;
}
q=q->fii[cuv[i]-'a'];
}
q->nrAparitii++;
}
void deleteCuvant(char cuv[])
{
stack <nod*> dedel;
nod* auxdel;
int l=strlen(cuv);
q=root;
for(int i=0; i<l; i++)
{
dedel.push(q);
q=q->fii[cuv[i]-'a'];
}
q->nrAparitii--;
auxdel=q;
while((auxdel!=root)&&!(auxdel->nrAparitii)&&!(auxdel->nrFii))
{
delete auxdel;
auxdel=dedel.top();
dedel.pop();
auxdel->nrFii--;
auxdel->fii[cuv[l-1]-'a']=NULL;
l--;
}
}
int aparitiiCuvant(char cuv[])
{
int l=strlen(cuv);
q=root;
for(int i=0; i<l; i++)
{
if(q->fii[cuv[i]-'a']==NULL)
return 0;
q=q->fii[cuv[i]-'a'];
}
return q->nrAparitii;
}
int prefix(char cuv[])
{
int l=strlen(cuv),r=0;
q=root;
while(r<l&&q->fii[cuv[r]-'a'])
{
q=q->fii[cuv[r]-'a'];
r++;
}
return r;
}
int main()
{
int op;
char cuv[22];
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
root =new nod;
for(; scanf("%d %s\n",&op,cuv)+1;)
{
if(op==0)
insertCuvant(cuv);
if(op==1)
deleteCuvant(cuv);
if(op==2)
printf("%d\n",aparitiiCuvant(cuv));
if(op==3)
printf("%d\n",prefix(cuv));
}
return 0;
}