Pagini recente » Cod sursa (job #3259824) | Cod sursa (job #523237) | Cod sursa (job #3271216) | Cod sursa (job #240978) | Cod sursa (job #3239460)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
struct Node
{
int nr = 0;
Node *next['z'-'a'+1] = {};
/*
next[0] -> 'a'
next[1] -> 'b'
...
next[25] -> 'z'
*/
};
void betesz(Node *root, char *str)
{
Node *akt = root;
for (int i = 0; str[i] != '\0'; i++) {
char betu = str[i];
if (akt->next[betu-'a'] == nullptr) {
akt->next[betu-'a'] = new Node;
akt = akt->next[betu-'a'];
}
else {
akt = akt->next[betu-'a'];
}
}
akt->nr++;
}
int hanyszor_van(Node *root, const char *str)
{
Node *akt = root;
for (int i = 0; str[i] != '\0'; i++) {
char betu = str[i];
if (akt->next[betu-'a'] == nullptr)
return 0;
akt = akt->next[betu-'a'];
}
return akt->nr;
}
void torol(Node *root, const char *str)
{
int hossz = 0;
Node *akt = root;
for (int i = 0; str[i] != '\0'; i++) {
char betu = str[i];
++hossz;
if (akt->next[betu-'a'] == nullptr)
return;
akt = akt->next[betu-'a'];
}
akt->nr--;
if (akt->nr == 0) {
// törölni kell azokat, amik alatt nincs
// > 0 érték
vector<Node *> csomopontok(hossz+1);
csomopontok[0] = root;
int hanyadik = 1;
Node *akt = root;
for (int i = 0; str[i] != '\0'; i++) {
char betu = str[i];
akt = akt->next[betu-'a'];
csomopontok[hanyadik] = akt;
hanyadik++;
}
for (int i = hossz; i >= 1; i--) {
// törölni kell egy pontot, ha nr-je
// 0 és nincs gyereke
akt = csomopontok[i];
bool van_gyerek = false;
for (char c = 'a'; c <= 'z'; c++)
if (akt->next[c-'a'] != nullptr)
van_gyerek = true;
if (van_gyerek || akt->nr > 0)
break;
else {
csomopontok[i-1]->next[str[i-1]-'a']
= nullptr;
delete akt;
}
}
}
}
int max_prefixhossz(Node *root, const char *str)
{
Node *akt = root;
int eredmeny = 0;
for (int i = 0; str[i] != '\0' && akt->next[str[i]-'a'] != nullptr; i++) {
++eredmeny;
akt = akt->next[str[i]-'a'];
}
return eredmeny;
}
int main()
{
ifstream fin("trie.in");
ofstream fout("trie.out");
Node *root = new Node;
int tipus;
char szo[25];
while (fin >> tipus >> szo) {
if (tipus == 0)
betesz(root, szo);
else if (tipus == 1)
torol(root, szo);
else if (tipus == 2)
fout << hanyszor_van(root, szo) << endl;
else
fout << max_prefixhossz(root, szo) << endl;
}
return 0;
}