Pagini recente » Cod sursa (job #1352618) | Cod sursa (job #339314) | Cod sursa (job #1907890) | Cod sursa (job #1949820) | Cod sursa (job #3120983)
///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()
{
for(int i=0; i<26; i++)
if(this->sons[i]!=nullptr)
delete this->sons[i];
}
};
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';
}
delete trie;
return 0;
}