Pagini recente » Cod sursa (job #2545561) | Cod sursa (job #650284) | Cod sursa (job #938038) | Rating Daniela (Anthelixes) | Cod sursa (job #2712351)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Node
{
int val=0;
int active_sons=0;
Node *v[27];
Node()
{
val=active_sons=0;
for (int j=0;j<=26;j++)
{
v[j]=nullptr;
}
}
}*Trie = new Node;
void update(Node *Tree,char *word,int litere_ramase,int val)
{
if (litere_ramase==0)
{
Tree->val+=val;
return;
}
int now=(*word-'a');
if (Tree->v[now]==nullptr)
{
Tree->active_sons++;
Tree->v[now]=new Node;
}
update (Tree->v[now],word+1,litere_ramase-1,val);
if (val==-1)
{
Node *Son=Tree->v[now];
if ((Son->val)==0&&Son->active_sons==0)
{
delete(Son);
Tree->active_sons--;
Tree->v[now]=nullptr;
}
}
}
int querycuvant(Node *Tree,char *word,int litere_ramase)
{
if (litere_ramase==0)
{
return Tree->val;
}
int now=(*word-'a');
if (Tree->v[now]==nullptr)
{
return 0;
}
return querycuvant(Tree->v[now],word+1,litere_ramase-1);
}
int LCP (Node *Tree, char *word, int litere_ramase,int cur_level)
{
if (litere_ramase==0)
{
return cur_level;
}
int now=(*word-'a');
if (Tree->v[now]==nullptr)
{
return cur_level;
}
return LCP(Tree->v[now],word+1,litere_ramase-1,cur_level+1);
}
int x,n;
char s[25];
int main()
{
Trie->val=1;
while (f>>x>>s)
{
n=strlen(s);
if (x==0)
{
update(Trie,s,n,1);
}
else
if (x==1)
{
update(Trie,s,n,-1);
}
else
if (x==2)
{
g<<querycuvant(Trie,s,n)<<'\n';
}
else
{
g<<LCP(Trie,s,n,0)<<'\n';
}
}
return 0;
}