Pagini recente » Cod sursa (job #2271257) | Cod sursa (job #844158) | Istoria paginii runda/rar8 | Cod sursa (job #1517307) | Cod sursa (job #2741124)
#include <fstream>
using namespace std;
struct Trie {
int nr, nrCuv;
Trie *lit[26];
Trie() {
nr = nrCuv = 0;
for (int i = 0; i < 26; i++)
lit[i] = 0;
}
};
Trie* root = new Trie();
void Insert(Trie* Nod, char *s) {
if (*s == 0)
Nod->nrCuv++;
else {
int ind = *s - 'a';
if (Nod->lit[ind] == 0) {
Nod->lit[ind] = new Trie();
Nod->nr++;
}
Insert(Nod->lit[ind], s + 1);
}
}
bool Delete(Trie *nod, char *s) {
if (*s == 0)
nod->nrCuv--;
else {
int ind = *s - 'a';
if (Delete(nod->lit[ind], s + 1)) {
nod->lit[ind] = NULL;
nod->nr--;
}
}
if (nod->nrCuv == 0 && nod->nr == 0 && nod != root) {
delete nod;
return 1;
}
return 0;
}
int Search(Trie *Nod, char *s) {
if (*s == 0)
return Nod->nrCuv;
else {
int ind = *s - 'a';
if (Nod->lit[ind])
return Search(Nod->lit[ind], s + 1);
}
return 0;
}
int LCP(Trie *Nod, char *s, int nr) {
if (*s == 0)
return nr;
int ind = *s - 'a';
if (Nod->lit[ind] == 0)
return nr;
return LCP(Nod->lit[ind], s + 1, nr + 1);
}
char s[21];
void solve() {
int op;
ifstream f("trie.in");
ofstream g("trie.out");
while (f >> op >> s) {
if (op == 0)
Insert(root, s);
else if (op == 1)
Delete(root, s);
else if (op == 2)
g << Search(root, s) << '\n';
else g << LCP(root, s, 0) << '\n';
}
f.close();
g.close();
}
int main() {
solve();
return 0;
}