Pagini recente » Cod sursa (job #3128417) | Cod sursa (job #969336) | Cod sursa (job #2759110) | Cod sursa (job #532) | Cod sursa (job #1757113)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
string s;
struct trie
{
int cnt, nrfii;
trie *fiu[26];
trie()
{
cnt = nrfii = 0;
memset (fiu, 0, sizeof (fiu));
}
};
trie *t= new trie;
void add (trie *nod, int k)
{
if (k == s.size() )
{
nod->cnt++;
return;
}
if (nod->fiu[s[k] - 'a'] == 0)
{
// cout << s[k];
nod->fiu[s[k]-'a'] = new trie;
nod->nrfii++;
}
add (nod->fiu[s[k] - 'a'], k + 1);
}
int del (trie *nod, int k)
{
if (k == s.size() )
{
nod->cnt --;
}
else if (del( nod->fiu[s[k] - 'a'], k + 1) == 1)
{
nod->fiu[s[k]-'a'] = 0;
nod->nrfii--;
}
if (nod->cnt == 0 && nod->nrfii == 0 && nod != t)
{
delete nod;
return 1;
}
return 0;
}
int cuv (trie *nod, int k)
{
if (k == s.size() )
{
return nod->cnt;
}
else if (nod->fiu[s[k] - 'a'])
cuv (nod->fiu[s[k] - 'a'], k + 1);
else
return 0;
}
int pre (trie *nod, int k)
{
if (k == s.size() )
return 0;
if (nod->fiu[s[k] - 'a'])
return 1 + pre (nod->fiu[s[k] - 'a'], k + 1);
return 0;
}
int main()
{
int n, op;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
while (fin >> op >> s)
{
if (op == 0)
{
add (t, 0);
}
if (op == 1)
del (t, 0);
if (op == 2)
{
int sol = cuv(t, 0);
fout << sol << "\n";
}
if (op == 3)
fout << pre (t,0) << "\n";
}
return 0;
}