Pagini recente » Cod sursa (job #409533) | Cod sursa (job #2396210) | Cod sursa (job #1217239) | Cod sursa (job #2227698) | Cod sursa (job #1755692)
#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)
{
//cout << nod->cnt <<" "<< k<<"\n";
if (k == s.size() ){
// cout << nod->cnt;
return nod->cnt;
// cout<<"here";
}
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 cin ("trie.in");
ofstream cout ("trie.out");
// cin >> n;
//for (int i = 1; i <= n; i++)
while (cin >> op >> s)
{
// cin >> op >> s;
if (op == 0)
{
add (t, 0);
}
if (op == 1)
del (t, 0);
if (op == 2){
int sol = cuv(t, 0);
cout << sol << "\n";
}
if (op == 3)
cout << pre (t,0) << "\n";
}
return 0;
}