Pagini recente » Cod sursa (job #1923891) | Cod sursa (job #2428486) | Cod sursa (job #1364343) | Cod sursa (job #404487) | Cod sursa (job #2665639)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
char s[1000005];
struct Node
{
int ap;
int nr;
Node *Next[27];
Node()
{
ap=0;
nr=0;
for(int i=0;i<=25;i++)
{
Next[i]=nullptr;
}
}
} *Trie = new Node;
void Update(Node *tree, char *word, int val, int rem)
{
if(rem==0)
{
tree->ap+=val;
return;
}
int now=(*word-'a');
if(tree->Next[now]==nullptr)
{
++tree->nr;
tree->Next[now]=new Node;
}
Update(tree->Next[now],word+1,val,rem-1);
if(val==-1)
{
Node *son = tree->Next[now];
if(!son->ap && !son->nr)
{
delete(son);
--tree->nr;
tree->Next[now]=nullptr;
}
}
}
int Query_Ap(Node *tree, char *word, int rem)
{
if(rem==0)
{
return tree->ap;
}
int now=(*word-'a');
if(tree->Next[now]==nullptr)
{
return 0;
}
return Query_Ap(tree->Next[now],word+1,rem-1);
}
int Query_LCP(Node *tree, char *word, int rem, int lvl)
{
if(rem==0)
{
return lvl;
}
int now = (*word-'a');
if(tree->Next[now]==nullptr)
{
return lvl;
}
return Query_LCP(tree->Next[now],word+1,rem-1,lvl+1);
}
int main()
{
int t;
while(f>>t>>(s+1))
{
if(t==0)
{
Update(Trie,s+1,1,strlen(s+1));
}
else if(t==1)
{
Update(Trie,s+1,-1,strlen(s+1));
}
else if(t==2)
{
g<<Query_Ap(Trie,s+1,strlen(s+1))<<'\n';
}
else if(t==3)
{
g<<Query_LCP(Trie,s+1,strlen(s+1),0)<<'\n';
}
}
return 0;
}