Pagini recente » Cod sursa (job #3038286) | Cod sursa (job #3231333) | Cod sursa (job #2827669) | Cod sursa (job #345363) | Cod sursa (job #3252027)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Tnode{
int cnt, nrfii;
Tnode *v[26];
Tnode()
{
cnt = 0;
nrfii = 0;
for(int i = 0; i < 26; i++)
v[i] = NULL;
}
};
Tnode *nod = new Tnode;
void add(Tnode *node, string s, int i)
{
if(i == s.size())
{
node->cnt++;
return;
}
if(node->v[s[i]-'a'] == NULL)
{
node->v[s[i]-'a'] = new Tnode;
node->nrfii++;
}
add(node->v[s[i]-'a'], s, i+1);
}
bool del(Tnode *node, string s, int i)
{
if(i == s.size())
{
node->cnt--;
if(node->cnt == 0 && node->nrfii == 0 && node != nod)
{
delete node;
return true;
}
return false;
}
if(del(node->v[s[i]-'a'], s, i+1))
{
node->nrfii--;
node->v[s[i]-'a']=NULL;
}
if(node->cnt == 0 && node->nrfii == 0 && node != nod)
{
delete node;
return true;
}
return false;
}
int nrap(Tnode *node, string s, int i)
{
if(i == s.size())
return node->cnt;
if(node->v[s[i]-'a'] == NULL)
return 0;
return nrap(node->v[s[i]-'a'], s, i+1);
}
int lpref(Tnode *node, string s, int i)
{
if(i == s.size())
return i;
if(node->v[s[i]-'a'] != NULL)
return lpref(node->v[s[i]-'a'], s, i+1);
return i;
}
int main()
{
int op;
string crt;
while(fin >> op)
{
fin >> crt;
if(op == 0)
add(nod, crt, 0);
else if(op == 1)
{
bool k = del(nod, crt, 0);
}
else if(op == 2)
fout << nrap(nod, crt, 0) << "\n";
else
fout << lpref(nod, crt, 0) << "\n";
}
return 0;
}