Pagini recente » Cod sursa (job #232470) | Cod sursa (job #2116040) | Cod sursa (job #2378729) | Cod sursa (job #1366757) | Cod sursa (job #2553575)
#include <cstring>
#include <fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod{
int fin = 0;
int nrc = 0;
nod *urm[30]{0};
}*root;
int type, l, last;
char cuv[30];
void add(nod *&p, int index)
{
if(index == l)
{
p->fin ++;
return;
}
if(!p->urm[cuv[index]-'a'])
{
p->urm[cuv[index]-'a'] = new nod;
p->nrc ++;
}
add(p->urm[cuv[index]-'a'], index+1);
}
bool ok = 1;
void del(nod *&p, int index)
{
if(index == l)
{
p->fin --;
if(p->fin == 0 && p->nrc == 0)
{
ok = 0;
p = 0;
delete p;
}
return;
}
del(p->urm[cuv[index]-'a'], index+1);
if(p->nrc == 1 && ok == 0)
{
p = 0;
delete p;
}
else{
ok = 1;
p->nrc --;
}
}
void fr(nod *p, int index)
{
if(index == l)
{
g<<p->fin<<'\n';
return;
}
fr(p->urm[cuv[index]-'a'], index+1);
}
void pref(nod *p, int index)
{
if(!p)
return;
last = index;
pref(p->urm[cuv[index]-'a'], index+1);
}
int main()
{
root = new nod;
while(f>>type>>cuv)
{
l = strlen(cuv);
if(type == 0)
add(root, 0);
else if(type == 1)
del(root, 0);
else if(type == 2)
fr(root, 0);
else{
pref(root, 0);
g<<last<<'\n';
}
}
return 0;
}