Pagini recente » Cod sursa (job #530838) | Cod sursa (job #1568337) | Cod sursa (job #782862) | Cod sursa (job #1650597) | Cod sursa (job #1439694)
#include<fstream>
#include<string>
using namespace std;
struct Node {
int final;
int intermediar;
Node* children[26];
};
Node* trie[26];
Node *new_node() {
Node *p = new Node();
p->intermediar = 0;
p->final = 0;
for (int i = 0; i < 26; i++) {
p->children[i] = 0;
}
return p;
}
void adauga(string x) {
if (trie[x[0] - 'a'] == 0) {
trie[x[0] - 'a'] = new_node();
}
Node *nod = trie[x[0] - 'a'];
if (x.size() == 1) {
nod->final++;
} else {
nod->intermediar++;
for (int i = 1; i < x.size() - 1; i++) {
if (nod->children[x[i] - 'a'] == 0) {
nod->children[x[i] - 'a'] = new_node();
}
nod = nod->children[x[i] - 'a'];
nod->intermediar++;
}
if (nod->children[x[x.size() - 1] - 'a'] == 0) {
nod->children[x[x.size() - 1] - 'a'] = new_node();
}
nod = nod->children[x[x.size() - 1] - 'a'];
nod->final++;
}
}
void sterge(string x) {
Node *nod = trie[x[0] - 'a'];
if (x.size() == 1) {
nod->final--;
} else {
nod->intermediar--;
for (int i = 1; i < x.size() - 1; i++) {
nod = nod->children[x[i] - 'a'];
nod->intermediar--;
}
nod = nod->children[x[x.size() - 1] - 'a'];
nod->final--;
}
}
int nr_aparitii(string x) {
if (trie[x[0] - 'a'] == 0) return 0;
Node *nod = trie[x[0] - 'a'];
for (int i = 1; i < x.size(); i++) {
nod = nod->children[x[i] - 'a'];
if (nod == 0) return 0;
}
return nod->final;
}
int prefix(string x) {
if (trie[x[0] - 'a'] == 0 || (trie[x[0] - 'a']->final == 0 && trie[x[0] - 'a']->intermediar == 0)) return 0;
int i = 0;
Node *nod = trie[x[0] - 'a'];
for (i = 1; i < x.size(); i++) {
nod = nod->children[x[i] - 'a'];
if (nod == 0 || (nod->final == 0 && nod->intermediar == 0)) break;
}
return i;
}
int main() {
ifstream fin("trie.in");
ofstream fout("trie.out");
int x;
string s;
while (fin >> x) {
fin >> s;
if (x == 0) adauga(s);
if (x == 1) sterge(s);
if (x == 2) fout << nr_aparitii(s) << "\n";
if (x == 3) fout << prefix(s) << "\n";
}
return 0;
}