Pagini recente » Cod sursa (job #1374820) | Cod sursa (job #1548170) | Borderou de evaluare (job #156738) | Cod sursa (job #672324) | Cod sursa (job #2019473)
#include <bits/stdc++.h>
using namespace std;
class Trie{
public:
Trie(){
NumberOfAppearances=0;
NumberOfSons=0;
memset(Nodes,'\0',sizeof(Nodes));
}
void add(string s,Trie *T){
if (s.size()==0){
T->NumberOfAppearances++;
}
else {
int pos=s[0]-'a';
if (T->Nodes[pos]==0){
T->Nodes[pos]=new Trie;
T->NumberOfSons++;
}
s.erase(s.begin());
add(s,T->Nodes[pos]);
}
}
int remove(string s,Trie *rad,Trie *T){
if (s.size()==0){
T->NumberOfAppearances--;
}
else {
int pos=s[0]-'a';
s.erase(s.begin());
if (remove(s,rad,T->Nodes[pos])){
T->Nodes[pos]=0;
T->NumberOfSons--;
}
if (T->NumberOfSons==0&&T->NumberOfAppearances==0&&T!=rad){
delete this;return 1;
}
return 0;
}
}
int NumberOfWords(string s,Trie *T){
if (s.size()==0){
return T->NumberOfAppearances;
}
int pos=s[0]-'a';
if (T->Nodes[pos]){
s.erase(s.begin());
return NumberOfWords(s,T->Nodes[pos]);
}
return 0;
}
int LongestPrefix(string s,int level,Trie *T){
if (s.size()==0){
return level;
}
int pos=s[0]-'a';
if (T->Nodes[pos]){
s.erase(s.begin());
return LongestPrefix(s,level+1,T->Nodes[pos]);
}
return level;
}
int NumberOfAppearances;
private:
Trie *Nodes[26];
int NumberOfSons;
};
Trie T;
string cuv;
int op;
int main(){
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while (cin>>op){
cin>>cuv;
switch (op){
case 0:T.add(cuv,&T);break;
case 1:T.remove(cuv,&T,&T);break;
case 2:cout<<T.NumberOfWords(cuv,&T)<<'\n';break;
case 3:cout<<T.LongestPrefix(cuv,0,&T)<<'\n';break;
}
}
}