Pagini recente » Cod sursa (job #2863138) | Cod sursa (job #1964828) | Cod sursa (job #637277) | Cod sursa (job #1687333) | Cod sursa (job #2453228)
#include <fstream>
#include <iostream>
#include <cstring>
#define ch (*s-'a')
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int op;
char cuv[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 >> op >> cuv) {
if(op == 0)
Insert(t, cuv);
else if(op == 1)
Delete(t, cuv);
else if(op == 2)
g << nrCuv(t, cuv) << '\n';
else
g << prefix(t, cuv, 0) << '\n';
}
}