Mai intai trebuie sa te autentifici.
Cod sursa(job #2553595)
Utilizator | Data | 22 februarie 2020 10:17:02 | |
---|---|---|---|
Problema | Trie | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.84 kb |
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod{
//int prefix=0;
int eFinal=0;
int nrCop=0;
nod *urm[30]={0};
};
nod *rad = new nod;
char cuv[30];
int cerinta;
int l;
void add(nod *&p, int pozInCuv)
{
if(pozInCuv == l)
{
p->eFinal++;
return ;
}
if(!p->urm[cuv[pozInCuv]-'a'])
p->urm[cuv[pozInCuv]-'a']=new nod;
p->urm[cuv[pozInCuv]-'a']->nrCop++;
add(p->urm[cuv[pozInCuv]-'a'], pozInCuv+1);
}
void del(nod *&p, int pozInCuv)
{
if(pozInCuv == l)
{
p->eFinal--;
if(!p->eFinal && !p->nrCop)
{
p=0;
delete p;
}
return ;
}
p->urm[cuv[pozInCuv]-'a']->nrCop--;
del(p->urm[cuv[pozInCuv]-'a'], pozInCuv+1);
if(p->nrCop==0 && p->eFinal==0 && pozInCuv!=0)
{
p=0;
delete p;
}
}
int frecv(nod *p, int pozInCuv)
{
if(pozInCuv == l)
{
return p->eFinal;
}
if(p->urm[cuv[pozInCuv]-'a'])
return frecv(p->urm[cuv[pozInCuv]-'a'], pozInCuv+1);
return 0;
}
int last=0;
int pref(nod *p, int pozInCuv, int k)
{
if(pozInCuv==l)
return l;
if(!p->urm[cuv[pozInCuv]-'a'] || p->urm[cuv[pozInCuv]-'a']->nrCop == 0)
return k;
return pref(p->urm[cuv[pozInCuv]-'a'], pozInCuv+1, k+1);
}
int main()
{
while(f>>cerinta>>cuv)
{
l=strlen(cuv);
if(cerinta == 0)
{
add(rad, 0);
continue;
}
if(cerinta == 1)
{
del(rad, 0);
continue;
}
if(cerinta == 2)
{
g<<frecv(rad, 0)<<'\n';
continue;
}
g<<pref(rad, 0, 0)<<'\n';
}
return 0;
}