Pagini recente » Cod sursa (job #108720) | Cod sursa (job #3213349) | Monitorul de evaluare | Cod sursa (job #2270422) | Cod sursa (job #717592)
Cod sursa(job #717592)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int n;
char sir[50];
struct Trie {
int cnt, fii;
Trie *fiu[26];
Trie() {
cnt = fii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie *t = new Trie;
void insert(Trie *nod, char cuv[50], int lc) {
int i;
for (i = 1; i <= lc; ++i) {
if (nod -> fiu[cuv[i] - 'a'] == 0) {
nod -> fii ++;
nod -> fiu[cuv[i] - 'a'] = new Trie;
}
nod = nod -> fiu[cuv[i]- 'a'];
}
nod -> cnt ++;
}
int del(Trie *nod, char cuv[50], int poz, int lc) {
int i;
if (poz > lc) {
nod -> cnt --;
}
else if (del(nod -> fiu[cuv[poz] - 'a'], cuv, poz + 1, lc)) {
nod -> fii --;
nod -> fiu[cuv[poz] - 'a'] = 0;
}
if (nod -> fii == 0 && nod -> cnt == 0 && nod != t) {
delete nod; return 1;
}
return 0;
}
int query(Trie *nod, char cuv[50], int lc) {
int i;
for (i = 1; i <= lc; ++i) {
if (nod -> fiu[cuv[i] - 'a'] == 0)
return 0;
nod = nod -> fiu[cuv[i] - 'a'];
}
return nod -> cnt;
}
int prefix(Trie *nod, char cuv[50], int lc) {
int i;
for (i = 1; i <= lc; ++i) {
if (nod -> fiu[cuv[i] - 'a'] == 0)
return i - 1;
nod = nod -> fiu[cuv[i] - 'a'];
}
return i - 1;
}
int main() {
int i, typeOP;
fin >> typeOP; fin.get(); fin.getline(sir + 1, 40);
while (sir[1] != '\0' && sir[1] != '\n') {
switch (typeOP) {
case 0: insert(t, sir, strlen(sir + 1)); break;
case 1: del(t, sir, 1, strlen(sir + 1)); break;
case 2: fout << query(t, sir, strlen(sir + 1)) << "\n"; break;
case 3: fout << prefix(t, sir, strlen(sir + 1)) << "\n"; break;
}
fin >> typeOP; fin.get(); fin.getline(sir + 1, 40);
}
fout.close();
return 0;
}