Pagini recente » Cod sursa (job #1538557) | Cod sursa (job #1588144) | Cod sursa (job #2368230) | Cod sursa (job #1725186) | Cod sursa (job #1768854)
#include <cstdio>
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct nod
{
nod *next[30];
int sf,nrfii;
nod()
{
sf=0;
nrfii=0;
for(int i=0; i<27; i++)
next[i]=0;
}
}rad;
void ins(char *w)
{
int ind=0;
nod *p=&rad;
while (w[ind]!='\0')
{
if (p->next[w[ind]-'a']==NULL)
{
nod *n=new nod;
p->next[w[ind]-'a']=n;
}
p->nrfii++;
p=p->next[w[ind]-'a'];
ind++;
}
p->sf++;
}
bool sterge(char *w,nod *p)
{
if(w[1]==0)
{
p->sf--;
if(p->sf==0&&p->nrfii==0) return 1;
return 0;
}
bool ok=sterge(w+1,p->next[w[0]-'a']);
if (ok==1)
{
delete p->next[w[0]-'a'];
p->next[w[0]-'a']=0;
if(p->nrfii==1)
return 1;
p->nrfii--;
return 0;
}
else
{
p->nrfii--;
return 0;
}
}
int cautare(char *w)
{
int ind=0;
nod *p=&rad;
while (w[ind]!=0)
if (p->next[w[ind]-'a'])
p=p->next[w[ind++]-'a'];
else return 0;
return p->sf;
}
int prefix(char *w)
{
int ind=0,nr=0;
nod *p=&rad;
while (w[ind]!=0)
if (p->next[w[ind]-'a'])
p=p->next[w[ind++]-'a'],nr++;
else return nr;
return nr;
}
int main()
{
int op;
char w[25];
fin>>op>>w;
int IND=1;
while (fin>>op>>w)
{
if (op==0)
ins(w);
else if (op==1)
sterge(w,&rad);
else if (op==2)
fout<<cautare(w)<<'\n';
else if (op==3) fout<<prefix(w)<<'\n';
op=-1;
IND++;
}
return 0;
}