Pagini recente » Cod sursa (job #71) | Cod sursa (job #2987098) | Cod sursa (job #1757166) | Cod sursa (job #3223555) | Cod sursa (job #3285842)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
trie *lg[26];
int nrfii,fr;
trie()
{
for(int i=0; i<26; i++) lg[i]=nullptr;
nrfii=0,fr=0;
}
};
trie *rad=new trie;
void add(trie *nod,string& s,int pos)
{
if(pos==s.size())
{
nod->fr++;
return;
}
int ch=s[pos]-'a';
if(!nod->lg[ch])
{
nod->lg[ch]=new trie;
nod->nrfii++;
}
add(nod->lg[ch],s,pos+1);
}
bool del(trie *nod,string& s,int pos)
{
if(pos==s.size())
{
nod->fr--;
}
else
{
int ch=s[pos]-'a';
if(del(nod->lg[ch],s,pos+1))
{
nod->nrfii--;
nod->lg[ch]=nullptr;
}
}
if(nod->nrfii==0 && nod->fr==0 && nod!=rad)
{
delete nod;
return true;
}
return false;
}
int app(trie *nod,string &s,int pos)
{
if(pos==s.size())
{
return nod->fr;
}
int ch=s[pos]-'a';
if(!nod->lg[ch]) return 0;
else return app(nod->lg[ch],s,pos+1);
}
int pref(trie *nod,string &s,int pos)
{
if(pos==s.size()) return pos;
int ch=s[pos]-'a';
if(!nod->lg[ch]) return pos;
return pref(nod->lg[ch],s,pos+1);
}
int main()
{
string s;
int tip;
while(fin>>tip>>s)
{
if(tip==0) add(rad,s,0);
else if(tip==1) del(rad,s,0);
else if(tip==2) fout<<app(rad,s,0)<<'\n';
else fout<<pref(rad,s,0)<<'\n';
}
return 0;
}