Pagini recente » Cod sursa (job #2927354) | Cod sursa (job #3236205) | Cod sursa (job #1480532) | Cod sursa (job #3213953) | Cod sursa (job #3190315)
#include <bits/stdc++.h>
using namespace std;
const int MAXN=2e5;
const int MAXM=2e5;
class Trie{
private:
int cntcuv=0, cntsuf=0;
Trie *copii[26]={};
public:
void insert(string s, int poz=0){
cntsuf++;
if(poz==(int)s.size())
cntcuv++;
else{
if(copii[s[poz]-'a']==0)
copii[s[poz]-'a']=new Trie;
copii[s[poz]-'a']->insert(s, poz+1);
}
}
void erase(string s, int poz=0){
cntsuf--;
if(poz==(int)s.size())
cntcuv--;
else{
copii[s[poz]-'a']->erase(s, poz+1);
if(copii[s[poz]-'a']->cntsuf==0){
delete copii[s[poz]-'a'];
copii[s[poz]-'a']=NULL;
}
}
}
int count(string s, int poz=0){
if(poz==(int)s.size())
return cntcuv;
if(copii[s[poz]-'a']==0)
return 0;
return copii[s[poz]-'a']->count(s, poz+1);
}
int countPrefComun(string s, int poz=0){
if(poz==(int)s.size())
return poz;
if(copii[s[poz]-'a']==0)
return poz;
return copii[s[poz]-'a']->countPrefComun(s, poz+1);
}
};
Trie trie;
signed main(){
ifstream cin("trie.in");
ofstream cout("trie.out");
int tip;
string s;
while(cin>>tip>>s){
if(tip==0)
trie.insert(s);
else if(tip==1)
trie.erase(s);
else if(tip==2)
cout<<trie.count(s)<<"\n";
else
cout<<trie.countPrefComun(s)<<"\n";
}
return 0;
}