Pagini recente » Cod sursa (job #321497) | Borderou de evaluare (job #1569673) | Cod sursa (job #2736735) | Cod sursa (job #1539215) | Cod sursa (job #3039640)
///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* add(Node* p,const char* w)
{
if(p==NULL)
p=new Node;
p->apps++;
if(w[0]==NULL)
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==NULL)
return p;
if(w[0]==NULL)
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=NULL;
}
return p;
}
int query_no_apps(Node* p,const char* w)
{
if(p==NULL)
return 0;
if(w[0]==NULL)
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==NULL || w[0]==NULL)
return 0;
if(p->sons[w[0]-'a']==NULL)
return 0;
else
return 1+query_prefix(p->sons[w[0]-'a'],w+1);
}
int main()
{
Node *trie=NULL;
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';
}
delete trie;
return 0;
}