Pagini recente » Cod sursa (job #1203531) | Monitorul de evaluare | Cod sursa (job #2011169) | Cod sursa (job #2003509) | Cod sursa (job #2482468)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int x;
string s;
struct trie{
trie* c[30];
int nrf, nrc;
trie(){
nrc=nrf=0;
for(int j=0;j<=27;j++){
c[j]=0;
}
}
};
trie *node=new trie;
void baga(trie *nod, int ind){
if(ind==s.size()) nod->nrc++;
else{
if(nod->c[s[ind]-'a']==0){
nod->nrf++;
nod->c[s[ind]-'a']=new trie;
}
baga(nod->c[s[ind]-'a'], ind+1);
}
}
int cauta(trie *nod, int ind){
if(ind==s.size()) return nod->nrc;
else if(nod->c[s[ind]-'a']) return cauta(nod->c[s[ind]-'a'], ind+1);
else return 0;
}
int cauta3(trie *nod, int ind){
if(ind==s.size()||nod->c[s[ind]-'a']==0) return ind;
return cauta3(nod->c[s[ind]-'a'], ind+1);
}
void scoate(trie *nod, int ind){
if(ind=s.size()) nod->nrc--;
else{
scoate(nod->c[s[ind]-'a'], ind+1);
if(!nod->c[s[ind]-'a']) nod->nrf--;
}
if(nod!=node&&nod->nrf==0&&nod->nrc==0) delete nod, nod=NULL;
}
int main()
{
while(fin>>x)
{
fin>>s;
if(x==0){
baga(node, 0);
}
else if(x==1){
scoate(node, 0);
}
else if(x==2){
fout<<cauta(node, 0)<<"\n";
}
else{
fout<<cauta3(node, 0)<<"\n";
}
}
return 0;
}