Pagini recente » Cod sursa (job #2771513) | Cod sursa (job #2722187) | Cod sursa (job #1194917) | Cod sursa (job #2984393) | Cod sursa (job #2183486)
#include<bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
const int CMax=2e6+3;
struct {
int pre,cuv;
int son[30];
}Trie[CMax];
int urm,nr,nod,tip;
string s;
void adauga(){
nod = 0;
for(int i=0; i<s.size();++i){
urm=Trie[nod].son[s[i]-'a'];
if(!urm){
urm = ++nr;
Trie[nod].son[s[i]-'a']=urm;
}
++Trie[urm].pre;
//cout<<"Trie[nod].pre"<<Trie[urm].pre<< " "<<"urm="<<urm<<endl;
nod=urm;
}
++Trie[nod].cuv;
}
void sterge(){
nod = 0;
for(int i = 0 ; i<s.size() ; ++i){
urm=Trie[nod].son[s[i]-'a'];
--Trie[urm].pre;
nod=urm;
}
--Trie[nod].cuv;
}
int nrAparitii(){
nod = 0;
for(int i = 0 ; i<s.size() ; ++i){
urm=Trie[nod].son[s[i]-'a'];
if(!Trie[urm].pre) return 0;
nod=urm;
}
return Trie[nod].cuv;
}
int prefix(){
nod = 0;
for(int i = 0 ; i<s.size() ; ++i){
urm=Trie[nod].son[s[i]-'a'];
if(!Trie[urm].pre) return i;
nod=urm;
}
return s.size();
}
int main(){
while(in>>tip>>s){
switch(tip){
case 0: adauga();
break;
case 1: sterge();
break;
case 2:out<<nrAparitii()<<'\n';
break;
case 3:out<<prefix()<<'\n';
break;
}
}
return 0;
}