Pagini recente » Rating Bura Lucian Andrei (luci_bura) | Cod sursa (job #47132) | Cod sursa (job #80496) | Cod sursa (job #458622) | Cod sursa (job #1969591)
#include <fstream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <stack>
#include <iomanip>
#include <queue>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct nod
{
nod *next[30];
int sf,fii;
nod()
{
sf=fii=0;
for (int i=0; i<27; i++)
next[i]=0;
}
};
nod *rad=new nod;
void adauga(char *cuv)
{
int poz=0;
nod *p=rad;
while (cuv[poz])
{
if (!p->next[cuv[poz]-'a'])
{
nod *n=new nod;
p->next[cuv[poz]-'a']=n;
}
p->fii++;
p=p->next[cuv[poz]-'a'];
poz++;
}
p->sf++;
}
bool sterge(char *cuv, nod *p)
{
if (!cuv[0])
{
p->sf--;
if (!p->sf&&!p->fii)
return 1;
return 0;
}
if (sterge(cuv+1,p->next[cuv[0]-'a']))
{
p->next[cuv[0]-'a']=0;
p->fii--;
if (!p->sf&&!p->fii)
return 1;
return 0;
}
else
{
p->fii--;
return 0;
}
}
int nrap(char *cuv)
{
int poz=0;
nod *p=rad;
while (cuv[poz])
{
if (!p->next[cuv[poz]-'a'])
return 0;
p=p->next[cuv[poz]-'a'];
poz++;
}
return p->sf;
}
int lgprefix(char *cuv)
{
int poz=0;
nod *p=rad;
while (cuv[poz])
{
if (!p->next[cuv[poz]-'a'])
return poz;
p=p->next[cuv[poz]-'a'];
poz++;
}
return poz-1;
}
int main()
{
int op;
char cuvant[25];
while (fin >> op)
{
fin >> cuvant;
if (op==0)
{
adauga(cuvant);
continue;
}
if (op==1)
{
sterge(cuvant,rad);
continue;
}
if (op==2)
{
fout << nrap(cuvant) << '\n';
continue;
}
fout << lgprefix(cuvant) << '\n';
}
}