Pagini recente » Cod sursa (job #978972) | Cod sursa (job #2533125) | Cod sursa (job #2805458) | Cod sursa (job #51277) | Cod sursa (job #2725874)
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
struct Trie {
int final, n;
Trie* v[26];
Trie() {
final = 0;
n = 0;
for(int i = 0; i < 26; ++i)
v[i] = NULL;
}
};
Trie *root = new Trie(), *current = new Trie();
void add(char* s) {
int l = strlen(s);
current = root;
for(int i = 0; i < l; ++i) {
if(current -> v[s[i] - 'a'] == NULL) {
current -> v[s[i] - 'a'] = new Trie();
++current -> n;
}
current = current -> v[s[i] - 'a'];
}
++current -> final;
}
bool remove(Trie* current, char* s) {
if(s[0] == '\0')
--current -> final;
else if(remove(current -> v[s[0] - 'a'], s+1)) {
--current -> n;
current -> v[s[0] - 'a'] = NULL;
}
if(current -> final == 0 && current -> n == 0 && current != root) {
delete current;
return 1;
}
return 0;
}
int count(char* s) {
current = root;
int l = strlen(s);
for(int i = 0; i < l; ++i)
if(current -> v[s[i] - 'a'])
current = current -> v[s[i] - 'a'];
else
return 0;
return current -> final;
}
int prefix(char* s) {
int i = 0, l = strlen(s);
current = root;
while(current -> v[s[i] - 'a'] != NULL && i < l) {
current = current -> v[s[i] - 'a'];
++i;
}
return i;
}
int main() {
ifstream fin("trie.in");
ofstream fout("trie.out");
int op;
char s[21];
while(fin >> op >> s) {
switch(op) {
case 0:
add(s);
break;
case 1:
remove(root, s);
break;
case 2:
fout << count(s) << '\n';
break;
case 3:
fout << prefix(s) << '\n';
break;
}
}
}