Pagini recente » Cod sursa (job #1855216) | Cod sursa (job #2061439) | Cod sursa (job #2587088) | Cod sursa (job #3340264) | Cod sursa (job #3349132)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
trie *fii[26];
int nrcuv = 0, cntlitera = 0;
trie()
{
for(int i = 0; i <= 25; ++i)
fii[i] = nullptr;
}
void adauga(string s, unsigned poz)
{
int c = s[poz] - 'a';
if(fii[c] == nullptr)
fii[c] = new trie();
fii[c]->cntlitera++;
if(poz == s.size() - 1)
{
fii[c]->nrcuv++;
return;
}
fii[c]->adauga(s, poz+1);
}
void sterge(string s, unsigned poz)
{
int c = s[poz] - 'a';
if(poz == s.size() - 1)
{
fii[c]->cntlitera--;
fii[c]->nrcuv--;
if(fii[c]->cntlitera == 0)
{
delete fii[c];
fii[c] = nullptr;
}
return;
}
fii[c]->sterge(s, poz+1);
fii[c]->cntlitera--;
if(fii[c]->cntlitera == 0)
{
delete fii[c];
fii[c] = nullptr;
}
}
int countcuv(string s, unsigned poz)
{
int c = s[poz] - 'a';
if(fii[c] == nullptr)
return 0;
if(poz == s.size() - 1)
return fii[c]->nrcuv;
return fii[c]->countcuv(s, poz+1);
}
int lpref(string s, unsigned poz)
{
int c = s[poz] - 'a';
if(fii[c] == nullptr)
return 0;
if(poz == s.size()-1)
return 1;
return 1 + fii[c]->lpref(s, poz+1);
}
};
trie T;
int main()
{
int tip;
while(fin>>tip)
{
string s;
fin>>s;
if(tip == 0)
T.adauga(s, 0);
else if(tip == 1)
T.sterge(s, 0);
else if(tip == 2)
fout<<T.countcuv(s, 0)<<"\n";
else
fout<<T.lpref(s, 0)<<"\n";
}
return 0;
}