Pagini recente » Cod sursa (job #1816263) | Cod sursa (job #1295303)
#include <fstream>
#include <map>
using namespace std;
struct TrieNode {
unsigned cnt,nrSons;
static const unsigned sigma = 'z'-'a'+1;
char c;
bool toDelete;
map<char,TrieNode *> children;
TrieNode() : TrieNode('\0') {}
TrieNode(char c) {
this->c = c;
cnt = nrSons = 0;
toDelete = false;
}
void insertWord(string::iterator c, string::iterator fn) {
if(c!=fn) {
if(!children[*c]) {
children[*c] = new TrieNode(*c);
nrSons++;
}
children[*c]->insertWord(c+1,fn);
}
else
cnt++;
}
void deleteWord(string::iterator c, string::iterator fn) {
if(c!=fn) {
if(children[*c]) {
children[*c]->deleteWord(c+1,fn);
if(children[*c]->toDelete) {
nrSons--;
delete children[*c];
children[*c] = nullptr;
}
if(nrSons == 0 && cnt == 0) {
toDelete = true;
}
}
}
else {
cnt--;
if(nrSons==0 && cnt==0) {
toDelete = true;
}
}
}
unsigned findWord(string::iterator c, string::iterator fn) {
if(c!=fn)
if(children[*c])
return children[*c]->findWord(c+1,fn);
else
return 0;
else {
return cnt;
}
}
unsigned longestPrefix(string::iterator c, string::iterator fn) {
if(c!=fn && children[*c])
return 1 + children[*c]->longestPrefix(c+1,fn);
return 0;
}
};
int main() {
TrieNode trie;
string s;
unsigned type;
ifstream in("trie.in");
ofstream out("trie.out");
while(in >> type >> s) {
switch(type) {
case 0: {
trie.insertWord(s.begin(),s.end());
}break;
case 1: {
trie.deleteWord(s.begin(),s.end());
}break;
case 2: {
out << trie.findWord(s.begin(),s.end()) << '\n';
}break;
case 3: {
out << trie.longestPrefix(s.begin(),s.end()) << '\n';
}break;
}
}
return 0;
}