Pagini recente » Cod sursa (job #3283377) | Cod sursa (job #1265965) | Cod sursa (job #2738221) | Cod sursa (job #2735819) | Cod sursa (job #1956978)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
#define lit (*s - 'a')
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
int cnt, nrfii;
Trie *fiu[26];
Trie() {
cnt = nrfii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie *T = new Trie;
void Ins(Trie *nod, char *s) {
if(*s == 0) {
nod->cnt++;
return;
}
if(nod->fiu[lit] == 0) {
nod->fiu[lit] = new Trie;
nod->nrfii++;
}
Ins(nod->fiu[lit], s + 1);
}
bool Del(Trie *nod, char *s) {
if(*s == 0)
--nod->cnt;
else if(Del(nod->fiu[lit], s + 1)) {
--nod->nrfii;
nod->fiu[lit] = 0;
}
if(nod != T && nod->cnt == 0 && nod->nrfii == 0) {
delete nod;
return 1;
}
return 0;
}
int NrAp(Trie *nod, char *s) {
if(*s == 0)
return nod->cnt;
if(nod->fiu[lit])
return NrAp(nod->fiu[lit], s + 1);
return 0;
}
int Pref(Trie *nod, char *s, int k) {
if(*s == 0 || nod->fiu[lit] == 0)
return k;
return Pref(nod->fiu[lit], s + 1, k + 1);
}
int main()
{
char s[25];
while(fin.getline(s, 25)) {
switch(s[0]) {
case '0' : Ins(T, s + 2); break;
case '1' : Del(T, s + 2); break;
case '2' : fout << NrAp(T, s + 2) << '\n'; break;
case '3' : fout << Pref(T, s + 2, 0) << '\n'; break;
}
}
return 0;
}