Pagini recente » Cod sursa (job #1879679) | Cod sursa (job #1668594) | Cod sursa (job #705747) | Cod sursa (job #1882769) | Cod sursa (job #1211275)
#include <fstream>
using namespace std;
struct trie {
int fii, nr;
trie *f[26];
trie() {
fii = nr = 0;
for (int i=0;i<26;i++)
f[i] = 0;
}
};
trie *root = new trie;
ifstream fin("trie.in");
ofstream fout("trie.out");
char s[23];
int t;
void insertTrie(trie *r, char *s) {
if (*s != 0) {
if (r->f[*s-'a'] == 0) {
r->f[*s-'a'] = new trie;
r->fii++;
}
insertTrie(r->f[*s-'a'], s+1);
} else
r->nr++;
}
int deleteTrie(trie *&r, char *s) {
if (*s == 0) {
r->nr--;
if (r->nr == 0 && r->fii == 0 && r!=root) {
delete r;
r = NULL;
return 1;
}
} else {
if ( deleteTrie( r->f[*s-'a'], s+1 ) ) {
r->fii--;
if (r->fii == 0 && r->nr == 0 && r!=root) {
delete r;
r = NULL;
return 1;
}
}
}
return 0;
}
int queryTrie(trie *&r, char *s) {
if (*s == 0)
return r->nr;
if (r->f[*s-'a'] == NULL)
return 0;
else
return queryTrie(r->f[*s-'a'], s+1);
}
int prefixTrie(trie *&r, char *s) {
if (*s == 0)
return 0;
if (r->f[*s-'a'] == NULL)
return 0;
else
return 1 + prefixTrie(r->f[*s-'a'], s+1);
}
int main() {
while (fin>>t>>s) {
if (t == 0) {
insertTrie(root, s);
} else
if (t == 1)
deleteTrie(root, s);
else
if (t == 2)
fout<<queryTrie(root, s)<<"\n";
else
fout<<prefixTrie(root, s)<<"\n";
}
return 0;
}