Pagini recente » Cod sursa (job #2559114) | Cod sursa (job #2902882) | Cod sursa (job #2178867) | Cod sursa (job #2870357) | Cod sursa (job #2748516)
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
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;
while (fin >> op >> s) {
if (op == 0)
Insert(root, s);
else if (op == 1)
Delete(root, s);
else if (op == 2)
fout<< Search(root, s) << '\n';
else fout<< LCP(root, s, 0) << '\n';
}
}
int main() {
solve();
return 0;
}