Pagini recente » Rating Bogdan Ivancu (Bogauuu) | Cod sursa (job #3292212) | Arhiva de probleme | Arhiva de probleme | Cod sursa (job #3292608)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fcin("trie.in");
ofstream fout("trie.out");
int c, rez;
string x;
struct trie
{
int nrf,cnt;
trie *fii[26];
trie()
{
nrf=0, cnt=0;
for (int i = 0; i < 26; ++i)
fii[i] = nullptr;
}
~trie()
{
for (int i = 0; i < 26; ++i)
delete fii[i];
}
};
trie *root = new trie;
inline void insert(const string &s, trie *nod, int poz)
{
if(poz==s.size())
{
nod->cnt++;
return;
}
int i=s[poz]-'a';
if(nod->fii[i]==nullptr)
nod->fii[i]=new trie, nod->nrf++;
insert(s, nod->fii[i], poz+1);
}
inline int erase(const string &s, trie *nod, int poz)
{
int i=s[poz]-'a';
if(poz==s.size())
{
nod->cnt--;
}
else
{
if(erase(s, nod->fii[i], poz+1))
{
nod->fii[i]=nullptr;
nod->nrf--;
}
}
if(nod->nrf==0 && nod->cnt==0 && nod!=root)
{
delete nod;
return 1;
}
return 0;
}
inline void fr(const string &s, trie *nod, int poz)
{
if(poz==s.size())
{
rez=nod->cnt;
return;
}
int i=s[poz]-'a';
if(nod->fii[i]!=nullptr)
fr(s, nod->fii[i], poz+1);
}
inline void query(const string &s, trie *nod, int poz)
{
if(poz==s.size())
{
rez=poz;
return;
}
int i=s[poz]-'a';
if(nod->fii[i]!=nullptr)
{
query(s, nod->fii[i], poz+1);
}
else
{
rez=poz;
return;
}
}
int main()
{
while(fcin>>c>>x)
{
rez=0;
if(c==0)
insert(x,root,0);
if(c==1)
if(erase(x,root,0));
if(c==2)
fr(x,root,0), fout<<rez<<'\n';
if(c==3)
query(x,root,0), fout<<rez<<'\n';
}
return 0;
}