Pagini recente » Cod sursa (job #2248539) | Cod sursa (job #2572519) | Cod sursa (job #720598) | Cod sursa (job #336569) | Cod sursa (job #3252029)
#include <fstream>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
const int Lmax = 26;
struct TRIE
{
struct Node
{
int cnt, nrf;
Node* v[Lmax];
Node()
{
cnt = nrf = 0;
for(int i = 0; i < 26; i ++)
v[i] = NULL;
}
};
Node* root = new Node();
void add_node(Node *nod, string s, int poz)
{
if(poz == s.size())
{
nod->cnt ++;
return;
}
if(nod->v[s[poz] - 'a'] == NULL)
nod->v[s[poz] - 'a'] = new Node(), nod->nrf ++;
add_node(nod->v[s[poz] - 'a'], s, poz + 1);
}
bool delete_node(Node *nod, string s, int poz)
{
if(poz == s.size())
{
nod->cnt --;
if(nod->cnt == 0 && nod != root && nod->nrf == 0)
{
delete nod;
return 1;
}
return 0;
}
bool sters = delete_node(nod->v[s[poz] - 'a'], s, poz + 1);
if(sters)
{
nod->nrf --;
nod->v[s[poz] - 'a'] = NULL;
}
if(nod->cnt == 0 && nod != root && nod->nrf == 0)
{
delete nod;
return 1;
}
return 0;
}
void count_ap(Node *nod, string s, int poz)
{
if(poz == s.size())
{
cout << nod->cnt << '\n';
return;
}
if(nod->v[s[poz] - 'a'] == NULL)
{
cout << 0 << '\n';
return;
}
count_ap(nod->v[s[poz] - 'a'], s, poz + 1);
}
void longest_pref(Node *nod, string s, int poz)
{
if(poz == s.size())
{
cout << s.size()<< '\n';
return;
}
if(nod->v[s[poz] - 'a'] == NULL || nod->nrf == 0)
{
cout << poz << '\n';
return;
}
longest_pref(nod->v[s[poz] - 'a'], s, poz + 1);
}
} trie;
int main()
{
int tip;
string s;
while(cin >> tip >> s)
{
if(tip == 0)
trie.add_node(trie.root, s, 0);
else if (tip == 1)
trie.delete_node(trie.root, s, 0);
else if(tip == 2)
trie.count_ap(trie.root, s, 0);
else
trie.longest_pref(trie.root, s, 0);
}
return 0;
}