Pagini recente » Cod sursa (job #781756) | Cod sursa (job #3120837)
///Buzatu Giulian
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int op;
string s;
struct Node
{
int apps=0,finish=0;///apps=appearances
vector<Node*>sons;
Node():sons(26) {}
};
Node *trie=nullptr;
Node* add(Node* p,const char* w)
{
if(p==nullptr)
p=new Node;
p->apps++;
if(w[0]=='\0')
p->finish++;
else
p->sons[w[0]-'a']=add(p->sons[w[0]-'a'],w+1);
return p;
}
Node* eradicate(Node* p,const char* w)
{
if(p==nullptr)
return p;
if(w[0]=='\0')
p->finish--;
else
p->sons[w[0]-'a']=eradicate(p->sons[w[0]-'a'],w+1);
p->apps--;
if(p->apps==0)
{
delete p;
p=nullptr;
}
return p;
}
int query_no_apps(Node* p,const char* w)
{
if(p==nullptr)
return 0;
if(w[0]=='\0')
return p->finish;
else
return query_no_apps(p->sons[w[0]-'a'],w+1);
}
int query_prefix(Node* p,const char* w)
{
if(p==nullptr || w[0]=='\0')
return 0;
if(p->sons[w[0]-'a']==nullptr)
return 0;
else
return 1+query_prefix(p->sons[w[0]-'a'],w+1);
}
int main()
{
while(f>>op>>s)
{
if(op==0)
trie=add(trie,s.c_str());
else if(op==1)
trie=eradicate(trie,s.c_str());
else if(op==2)
g<<query_no_apps(trie,s.c_str())<<'\n';
else
g<<query_prefix(trie,s.c_str())<<'\n';
}
return 0;
}