Pagini recente » Cod sursa (job #2508524) | Cod sursa (job #689548) | Cod sursa (job #1002930) | Cod sursa (job #628031) | Cod sursa (job #1314562)
#include<fstream>
#include<cstring>
#define NEXT root -> next[word[0]-'a']
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
int ap;
Trie *next[26];
Trie(int apa) {
ap = apa;
memset(next, NULL, sizeof(next));
}
};
typedef Trie* pTrie;
pTrie root, p;
void addWord(char *word, pTrie root) {
if(word[0] != NULL) {
if(!NEXT) {
NEXT = new Trie(1);
}
else
NEXT -> ap ++;
addWord(word+1, NEXT);
}
}
void removeWord(char word[21], pTrie root) {
if(word[0] != NULL) {
removeWord(word+1, NEXT);
if(NEXT -> ap == 1) {
delete NEXT;
NEXT = NULL;
} else {
NEXT -> ap--;
}
}
}
int findPref(char word[21], pTrie root) {
if(NEXT == NULL) return 0;
if(word[0] == NULL) return 0;
return 1 + findPref(word + 1, NEXT);
}
int nrap (char word[21], pTrie root) {
if(NEXT == NULL) return 0;
if(word[1] == NULL) {
int s = 0;
for(int i=0; i<26; i++) {
if(NEXT -> next[i])
s+= NEXT -> next[i] -> ap;
}
return NEXT -> ap - s;
}
return nrap(word+1, NEXT);
}
int main() {
int type; char word[21];
pTrie root = new Trie(0);
while(fin>>type>>word) {
if(type == 0) {
addWord(word, root);
} else if(type == 1) {
removeWord(word, root);
} else if(type == 3) {
fout<<findPref(word, root)<<'\n';
} else {
fout<<nrap(word, root)<<'\n';
}
}
return 0;
}