Pagini recente » Cod sursa (job #805617) | Cod sursa (job #1273573) | Cod sursa (job #2882037) | Cod sursa (job #1899174) | Cod sursa (job #3318382)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct TRIE{
struct Node{
int apps, finish;
vector<Node*> sons;
Node():sons(26), apps(0), finish(0){}
~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 number_of_apps(Node* p, const char* w){
if(p==nullptr){
return 0;
}
if(w[0]=='\0'){
return p->finish;
}else{
return number_of_apps(p->sons[w[0]-'a'], w+1);
}
}
int length(Node* p, const char* w){
if(p==nullptr or w[0]=='\0'){
return 0;
}
if(p->sons[w[0]-'a']==nullptr){
return 0;
}else{
return 1+length(p->sons[w[0]-'a'],w+1);
}
}
};
int main(){
string s;
int tip;
TRIE ans;
while(fin>>tip>>s){
if(tip==0){
ans.trie=ans.add(ans.trie, s.c_str());
}else if(tip==1){
ans.trie=ans.eradicate(ans.trie, s.c_str());
}else if(tip==2){
fout<<ans.number_of_apps(ans.trie, s.c_str())<<'\n';
}else{
fout<<ans.length(ans.trie, s.c_str())<<'\n';
}
}
}