Pagini recente » Cod sursa (job #3279812) | Cod sursa (job #877640) | Cod sursa (job #613679) | Cod sursa (job #2468421) | Cod sursa (job #2907439)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Nod
{
int fr;
int nrprefix;
Nod *leg[26];
Nod()
{
fr=nrprefix=0;
for(int i=0;i<=26;i++)
leg[i]=NULL;
}
};
class Trie
{
protected:
Nod *rad;
public:
Trie()
{
rad=new Nod;
}
void Add(string w)
{
int i,j;
Nod *p,*q;
p=rad;
for(i=0;i<w.size();i++)
{
j=w[i]-'a';
p->nrprefix++;
if(p->leg[j]==NULL)
{
q=new Nod;
p->leg[j]=q;
}
p=p->leg[j];
}
p->nrprefix++;
p->fr++;
}
void Del(string w)
{
int i,j;
Nod *p;
p=rad;
for(i=0;i<w.size();i++)
{
j=w[i]-'a';
p->nrprefix--;
p=p->leg[j];
}
p->nrprefix--;
p->fr--;
}
int NrAp(string w)
{
int i,j;
Nod *p;
p=rad;
for(i=0;i<w.size();i++)
{
j=w[i]-'a';
if(p->leg[j]==NULL)return 0;
p=p->leg[j];
}
return p->fr;
}
int Prefix(string w)
{
int i,j;
Nod *p;
p=rad;
for(i=0;i<w.size();i++)
{
j=w[i]-'a';
if(p->nrprefix==0)return i-1;
if(p->leg[j]==NULL)return i;
p=p->leg[j];
}
return w.size();
}
};
int main()
{
Trie T;
int n,op;
string cuv;
while(fin>>op>>cuv)
{
if(op==0)T.Add(cuv);
else if(op==1)T.Del(cuv);
else if(op==2)fout<<T.NrAp(cuv)<<"\n";
else if(op==3)fout<<T.Prefix(cuv)<<"\n";
}
return 0;
}