Pagini recente » Cod sursa (job #7463) | Cod sursa (job #469174) | Cod sursa (job #3210517) | Cod sursa (job #581321) | Cod sursa (job #2876821)
#include <fstream>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
string s;
int aux;
struct trie
{
int cnt, fin;
trie* fii[27];
trie()
{
cnt = fin = 0;
for (aux = 1; aux <= 27; aux++)
fii[aux] = 0;
};
};
trie *tr = new trie;
void modif (trie *x, int poz, int pmax, int val)
{
x->cnt += val;
if (poz <= pmax)
{
int ch = s[poz] - 'a' + 1;
if (x->fii[ch] == 0)
x->fii[ch] = new trie;
modif (x->fii[ch], poz + 1, pmax, val);
}
else
x->fin += val;
}
int nraparitii (trie *x, int poz, int pmax)
{
if (poz <= pmax)
{
char ch = s[poz] - 'a' + 1;
if (x->fii[ch] == 0 || x->fii[ch]->cnt == 0)
return 0;
return nraparitii (x->fii[ch], poz + 1, pmax);
}
else
return x->fin;
}
int prefix (trie *x, int poz, int pmax)
{
if (poz <= pmax)
{
char ch = s[poz] - 'a' + 1;
if (x->fii[ch] == 0 || x->fii[ch]->cnt == 0)
return poz;
return prefix (x->fii[ch], poz + 1, pmax);
}
else
return poz;
}
int main()
{
int t;
while (cin >> t)
{
cin >> s;
if (t == 0)
modif (tr, 0, s.size() - 1, 1);
if (t == 1)
modif (tr, 0, s.size() - 1, -1);
else if (t == 2)
cout << nraparitii (tr, 0, s.size() - 1) << '\n';
else if (t == 3)
cout << prefix (tr, 0, s.size() - 1) << '\n';
}
return 0;
}