Pagini recente » Cod sursa (job #786772) | Cod sursa (job #1848725) | Cod sursa (job #1245790) | Cod sursa (job #71008) | Cod sursa (job #2169609)
#include <fstream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#define pu(x) ((x^(x-1))&x)
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
int ap,sf;
trie *next[30];
trie()
{
ap=sf=0;
for (int i=0; i<27; i++)
next[i]=0;
}
};
trie *rad = new trie();
void adauga(char *cuv, trie *p)
{
if (cuv[0]=='\0')
{
p->ap++;
p->sf++;
return;
}
p->ap++;
if (!p->next[cuv[0]-'a'])
{
trie *nextt = new trie();
p->next[cuv[0]-'a']=nextt;
}
adauga(cuv+1,p->next[cuv[0]-'a']);
}
void sterge(char *cuv, trie *p)
{
if (cuv[0]=='\0')
{
p->ap--;
p->sf--;
return;
}
sterge(cuv+1, p->next[cuv[0]-'a']);
if (p->next[cuv[0]-'a']->ap==0)
{
delete p->next[cuv[0]-'a'];
p->next[cuv[0]-'a']=0;
}
}
int nrap(char *cuv, trie *p)
{
if (cuv[0]=='\0')
return p->sf;
if (!p->next[cuv[0]-'a'])
return 0;
return nrap(cuv+1,p->next[cuv[0]-'a']);
}
int lgp(char *cuv, trie *p)
{
if (cuv[0]=='\0')
return 0;
if (!p->next[cuv[0]-'a'])
return 0;
return lgp(cuv+1,p->next[cuv[0]-'a'])+1;
}
int main()
{
int op;
char s[30];
while (fin>>op)
{
fin >> s;
if (op==0)
adauga(s,rad);
else if (op==1)
sterge(s,rad);
else
if (op==2)
fout << nrap(s,rad) << '\n';
else
fout << lgp(s,rad) << '\n';
}
}