Pagini recente » Cod sursa (job #3342291) | Cod sursa (job #2293376) | Cod sursa (job #160822) | Cod sursa (job #3319752) | Cod sursa (job #3317044)
//https://infoarena.ro/problema/trie
//#pragma GCC optimize ("Ofast")
//#pragma GCC optimize ("fast-math")
//#pragma GCC optimize ("unroll-loops")
//#define _USE_MATH_DEFINES
#include <iostream>
#include <fstream>
//#include <vector>
//#include <cstring>
//#include <cmath>
//#include <bitset>
//#include <queue>
//#include <stack>
//#include <utility>
//#include <algorithm>
//#include <string>
//#include <map>
//#include <unordered_map>
//#include <set>
//#include <unordered_set>
//#include <cstdint>
//#include <climits>
//#include <iomanip>
//#include <cstdio>
//#include <tuple>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int CHMAX = 26;
struct Nod
{
int nrc; // Numarul de cuvinte care se termina pe nodul acesta
int nrcd; // Numarul de cuvinte care sunt sub nodul acesta
Nod* ch[CHMAX];
Nod() : nrc(0), nrcd(0), ch{} {};
};
void insert(Nod* nod, char* c)
{
nod->nrcd += 1;
if (*c == '\0')
{
nod->nrc += 1;
}
else
{
int nr = *c - 'a';
if (!nod->ch[nr])
nod->ch[nr] = new Nod();
insert(nod->ch[nr], c + 1);
}
}
void erase(Nod* nod, char* c)
{
nod->nrcd -= 1;
if (*c == '\0')
{
nod->nrc -= 1;
}
else
{
int nr = *c - 'a';
erase(nod->ch[nr], c + 1);
if (nod->ch[nr]->nrcd == 0)
{
nod->ch[nr] = nullptr;
delete nod->ch[nr];
}
}
}
int rez1(Nod* nod, char* c)
{
if (*c == '\0')
return nod->nrc;
int nr = *c - 'a';
if (!nod->ch[nr])
return 0;
return rez1(nod->ch[nr], c + 1);
}
int rez2(Nod* nod, char* c)
{
if (*c == '\0')
return 0;
int nr = *c - 'a';
if (!nod->ch[nr])
return 0;
return rez2(nod->ch[nr], c + 1) + 1;
}
int main()
{
//ios_base::sync_with_stdio(false);
//cin.tie(NULL);
Nod* rad = new Nod();
char str[CHMAX];
int c;
while (fin >> c >> str)
{
if (c == 0)
{
insert(rad, str);
}
else if (c == 1)
{
erase(rad, str);
}
else if (c == 2)
{
fout << rez1(rad, str) << "\n";
}
else
{
fout << rez2(rad, str) << "\n";
}
}
return 0;
}