Pagini recente » Cod sursa (job #552636) | Cod sursa (job #1829270) | Cod sursa (job #1958187) | Cod sursa (job #1683070) | Cod sursa (job #1218303)
#include <fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
char line[55];
struct trie {
int nr;
int fii;
trie *fiu[26];
trie () {
nr = fii = 0;
for (int i=0; i<26; ++i)
fiu[i] = NULL;
}
} *T = new trie;
void Update (trie *nod, char *s) {
if (*s == 0) {
++nod->nr;
return;
}
if (nod->fiu[*s - 'a'] == NULL) {
nod->fiu[*s - 'a'] = new trie;
++nod->fii;
}
Update (nod->fiu[*s - 'a'], s+1);
}
bool Delete (trie *nod, char *s) {
if (*s == 0)
--nod->nr;
else
if (Delete (nod->fiu[*s - 'a'], s+1)) {
--nod->fii;
nod->fiu[*s - 'a'] = NULL;
}
if (nod->fii == 0 && nod->nr == 0 && nod != T) {
delete nod;
return 1;
}
return 0;
}
int Query1 (trie *nod, char *s) {
if (*s == 0)
return nod->nr;
if (nod->fiu[*s - 'a'] != NULL)
return Query1(nod->fiu[*s - 'a'], s+1);
return 0;
}
int Query2 (trie *nod, char *s, int k) {
if (*s == 0)
return k;
if (nod->fiu[*s - 'a'] != NULL)
return Query2 (nod->fiu[*s - 'a'], s+1, k+1);
return k;
}
int main () {
while ( f.get(line, 50) ) {
if (line[0] == '0')
Update (T, line+2);
else
if (line[0] == '1')
Delete (T, line+2);
else
if (line[0] == '2')
g << Query1 (T, line+2) << "\n";
else
if (line[0] == '3')
g << Query2 (T, line+2, 0) << "\n";
f.get ();
}
return 0;
}