Pagini recente » Cod sursa (job #1453486) | Cod sursa (job #1872847) | Cod sursa (job #2534521) | Cod sursa (job #1895755) | Cod sursa (job #2075128)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char cuv[30];
struct nod
{
int cnt;
int nr_fii;
nod *son[27];
nod()
{
for(int i=0; i<27; ++i)
son[i] = NULL;
cnt = nr_fii = 0;
}
};
nod *root = new nod();
void add(nod *crt, int ind)
{
if(cuv[ind] == '\0')
{
crt -> cnt ++;
return;
}
if(crt->son[cuv[ind]-'a'] == NULL)
{
crt->son[cuv[ind] - 'a'] = new nod;
crt->nr_fii++;
}
add(crt->son[cuv[ind]-'a'], ind+1);
}
int del(nod *crt, int ind)
{
if(cuv[ind] == '\0')
{
crt -> cnt--;
}
else
{
if(del(crt->son[cuv[ind] - 'a'],ind+1))
{
crt->nr_fii--;
crt->son[cuv[ind]-'a'] = NULL;
}
}
if(crt->nr_fii == 0 && crt->cnt == 0 && crt!=root)
{
delete crt;
return 1;
}
return 0;
}
void del1(nod *crt, int ind)
{
if(cuv[ind] == '\0')
{
crt -> cnt--;
return;
}
del(crt->son[cuv[ind] - 'a'], ind+1);
if(crt->son[cuv[ind] - 'a']->cnt == 0 &&
crt->son[cuv[ind] - 'a']->nr_fii == 0)
{
delete crt->son[cuv[ind] - 'a'];
crt->son[cuv[ind] - 'a'] = 0;
crt->nr_fii--;
}
}
int cnt(nod *crt, int ind)
{
if(cuv[ind] == '\0')
return crt->cnt;
if(crt->son[cuv[ind] - 'a'] == NULL)
{
return 0;
}
return cnt(crt->son[cuv[ind] - 'a'], ind+1);
}
int prefix(nod *crt, int ind)
{
if(crt == NULL)
return ind-1;
if(cuv[ind] == '\0')
return ind;
return prefix(crt->son[cuv[ind]-'a'], ind+1);
}
void ReadSolve()
{
int op;
while(fin >> op >> cuv)
{
if(op == 0)
{
add(root, 0);
}
else if(op == 1)
{
del1(root, 0);
}
else if(op == 2)
{
fout << cnt(root, 0) << "\n";
}
else if(op == 3)
{
fout << prefix(root, 0) << "\n";
}
}
}
int main()
{
ReadSolve();
return 0;
}