Pagini recente » Cod sursa (job #230983) | Cod sursa (job #3144657) | Cod sursa (job #45590) | Cod sursa (job #2192139) | Cod sursa (job #3308628)
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
struct trie{
int cnt, nrf;
trie * fii[26];
trie() {
cnt=0; nrf=0;
for(int i=0; i<26; i++)
fii[i]=nullptr;
}
};
trie* tr;
void add(trie * t, char *s, int n, int l){
if(l==n){
t -> cnt++;
return;
}
int indx=s[l]-'a';
if(t -> fii[indx] == nullptr){
t -> fii[indx] = new trie;
t -> nrf++;
}
add(t->fii[indx], s, n, l+1);
}
bool del(trie * t, char *s, int n, int l){
if(l==n)
t -> cnt--;
else if(del(t -> fii[s[l]-'a'], s, n, l+1)){
t -> nrf--;
t -> fii[s[l]-'a'] = nullptr;
}
if(t -> cnt == 0 && t -> nrf == 0 && t != tr){
delete t;
return 1;
}
return 0;
}
int f(trie *t, char *s, int n, int l){
if(l==n)
return t->cnt;
if(t->fii[s[l]-'a']!=nullptr)
return f(t->fii[s[l]-'a'], s, n, l+1);
return 0;
}
int pf(trie *t, char *s, int n, int l){
if(l==n)
return n;
if(t->fii[s[l]-'a']!=nullptr)
return pf(t->fii[s[l]-'a'], s, n, l+1);
return l;
}
int main()
{
tr=new trie;
int op; char s[22];
while(cin>>op>>s){
int n=strlen(s);
if(op==0)
add(tr, s, n, 0);
if(op==1)
del(tr, s, n, 0);
if(op==2)
cout<<f(tr, s, n, 0);
if(op==3)
cout<<pf(tr, s, n, 0);
if(op>1)
cout<<'\n';
}
return 0;
}