Pagini recente » Cod sursa (job #2811528) | Cod sursa (job #1328207) | Cod sursa (job #2856851) | Cod sursa (job #2398731) | Cod sursa (job #2453223)
#include <fstream>
#include <iostream>
#include <cstring>
#define ch (*s-'a')
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int op;
char line[32];
struct trie{
int nrfii, val;
trie* fii[26];
trie() {
val = nrfii = 0;
for(int i = 0; i < 26; i++)
fii[i] = 0;
}
};
trie *t = new trie;
void Insert(trie *nod, char* s) {
if(*s == NULL) {
nod->val++;
return;
}
if(nod->fii[ch] == 0) {
nod->fii[ch] = new trie;
nod->nrfii++;
}
Insert(nod->fii[ch], s+1);
}
int Delete(trie *nod, char *s) {
if(*s == NULL)
nod->val--;
else if(Delete(nod->fii[ch], s+1)) {
nod->fii[ch] = 0;
nod->nrfii--;
}
if(nod->val == 0 && nod->nrfii == 0 && nod != t) {
delete nod;
return 1;
}
return 0;
}
int nrCuv(trie *nod, char *s) {
if(*s == NULL)
return nod->val;
if(nod->fii[ch])
return nrCuv(nod->fii[ch], s+1);
return 0;
}
int prefix(trie *nod, char *s, int k) {
if(*s == NULL || nod->fii[ch] == 0)
return k;
return prefix(nod->fii[ch], s+1, k+1);
}
int main() {
while(!f.eof()) {
f.getline(line, 32);
if(line[0] == '0')
Insert(t, line+2);
else if(line[0] == '1')
Delete(t, line+2);
else if(line[0] == '2')
g << nrCuv(t, line+2) << '\n';
else
g << prefix(t, line+2, 0) << '\n';
}
}