Pagini recente » Cod sursa (job #1712032) | Cod sursa (job #3146396) | Cod sursa (job #1070226) | Cod sursa (job #1751382) | Cod sursa (job #1829524)
#include <fstream>
#include <cstring>
#include <iostream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie {
trie *fi[30];
int nap, nfii;
trie() {
nap = nfii = 0;
memset(fi, 0, sizeof(fi));
}
};
trie* inc;
char s[25];
int rez2(trie *k, char *n) {
if (!(*n >='a'&&*n<='z'))
return k -> nap;
if (k -> fi[*n-'a'])
return rez2(k->fi[*n-'a'],n+1);
return 0;
}
int rez1(trie *k, char *n) {
int sol = 0;
while (*n >= 'a' && *n <= 'z') {
if (k -> fi[*n - 'a'])
k = k -> fi[*n-'a'];
else break;
sol++;
n++;
}
return sol;
}
void inser(trie *k, char *n) {
while (*n >= 'a' && *n <= 'z') {
if (k -> fi[*n-'a'] == 0) {
k -> fi[*n-'a'] = new trie;
k -> nfii++;
}
k = k -> fi[*n-'a'];
n++;
}
k -> nap++;
}
int delet(trie *k, char *n ) {
if (!(*n >= 'a' && *n <= 'z')) {
k -> nap--;
}
else if (delet(k -> fi[*n-'a'], n+1)) {
k -> fi[*n-'a']= 0;
k -> nfii--;
}
if (k -> nfii == 0 && k -> nap == 0 && k != inc){
delete k;
return 1;
}
return 0;
}
int main() {
inc = new trie;
while (f.getline(s, sizeof(s))) {
if (s[0] == '0')
inser(inc, s+2);
else if (s[0] == '1')
delet(inc, s+2);
else if (s[0] == '2')
g << rez2(inc, s+2)<<'\n';
else g << rez1(inc, s+2)<<'\n';
}
return 0;
}