Pagini recente » Cod sursa (job #97344) | Cod sursa (job #753003) | Cod sursa (job #2835949) | Cod sursa (job #2492893) | Cod sursa (job #638599)
Cod sursa(job #638599)
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
const int SIGMA = 30;
class Node {
public:
int freq;
char letter;
vector <Node> son;
Node() {};
Node(int a, char c, vector <Node> s) {
freq = a;
letter = c;
son = s;
}
};
class Trie {
Node root;
void addWord(Node &root, int pos, const string &s) {
char letter = s[pos];
int position = -1;
for (int i = 0; i < root.son.size(); i++) {
if (root.son[i].letter == letter) {
position = i;
break;
}
}
if (position == -1) {
Node aux = Node(0, letter, vector<Node>());
root.son.push_back(aux);
position = root.son.size()-1;
}
if (pos == s.length()-1) {
root.son[position].freq++;
} else {
addWord(root.son[position], pos+1, s);
}
};
void eraseNode(vector <Node> &v, int pos) {
int end = v.size()-1;
v[pos] = v[end];
v.pop_back();
};
void eraseWord(Node &root, int pos, const string &s) {
int position = -1;
if (pos == s.size()) {
root.freq--;
} else {
for (int i = 0; i < root.son.size(); i++) {
if (root.son[i].letter == s[pos]) {
position = i;
break;
}
}
eraseWord(root.son[position], pos+1, s);
if (root.son[position].freq == 0 && root.son[position].son.empty()) {
eraseNode(root.son, position);
}
}
};
int findWord(const Node &root, int pos, const string &s) {
if (pos == s.size()) {
return root.freq;
} else {
int position = -1;
for (int i = 0; i < root.son.size(); i++) {
if (root.son[i].letter == s[pos]) {
position = i;
break;
}
}
if (position >= 0) {
int aux = findWord(root.son[position], pos+1, s);
return aux;
}
return 0;
}
};
int findLongestPrefix(const Node &root, int pos, string &s) {
if (pos == s.size()) {
return 0;
}
int position = -1;
for (int i = 0; i < root.son.size(); i++) {
if (root.son[i].letter == s[pos]) {
position = i;
break;
}
}
if (position == -1) {
return 0;
} else {
return 1 + findLongestPrefix(root.son[position], pos+1, s);
}
};
public:
void addWord(string &s) {
addWord(root, 0, s);
};
void eraseWord(string &s) {
eraseWord(root, 0, s);
};
int findWord(string &s) {
return findWord(root, 0, s);
};
int findLongestPrefix(string &s) {
return findLongestPrefix(root, 0, s);
};
};
int main() {
ifstream f("trie.in");
ofstream g("trie.out");
int t;
string s;
Trie trie;
while (f >> t) {
f >> s;
if (t == 0) {
trie.addWord(s);
} else if (t == 1) {
trie.eraseWord(s);
} else if (t == 2) {
g << trie.findWord(s) << '\n';
} else {
g << trie.findLongestPrefix(s) << '\n';
}
}
return 0;
}