Pagini recente » Cod sursa (job #561176) | Cod sursa (job #1337005) | Cod sursa (job #1782617) | Cod sursa (job #694117) | Cod sursa (job #2261898)
#include <fstream>
#include <cstring>
#define CH (*s - 'a')
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Trie {
int pr;
Trie *fii[26];
};
Trie *T= new Trie;
void adaug(Trie *p, char *s) {
p -> pr++;
if(*s != '\0') {
if(p->fii[CH] == NULL)
p->fii[CH] = new Trie();
adaug(p->fii[CH], s + 1);
}
}
int elim( Trie *p, char *s){
p->pr--;
if(*s != '\0') {
elim(p->fii[CH], s + 1);
}
}
int apar(Trie *p, char *s) {
if(*s != '\0') {
if(p->fii[CH] == NULL)
return 0;
else
return apar(p->fii[CH], s + 1);
} else {
int res = p->pr;
for(int i = 0; i < 26; i++) {
if(p->fii[i] != NULL)
res -= p->fii[i]->pr;
}
return res;
}
}
int prefix(Trie *p, char *s, int k) {
if(*s == '\0')
return k;
else {
if(p->fii[CH] != NULL && 0 < p->fii[CH]->pr)
return prefix(p->fii[CH], s + 1, k + 1);
else
return k;
}
}
int main()
{
char s[32];
while(in.getline(s, 31)) {
if(s[0] == '0')
adaug(T, s + 2);
else if(s[0] == '1')
elim(T, s + 2);
else if(s[0] == '2')
out<< apar(T, s + 2) <<'\n';
else
out<< prefix(T, s + 2, 0) <<'\n';
}
in.close();
out.close();
return 0;
}