Pagini recente » Cod sursa (job #2059508) | Cod sursa (job #489021) | Cod sursa (job #2907836) | Cod sursa (job #23938) | Cod sursa (job #2819782)
#include <stdio.h>
#include <vector>
#include <iostream>
#include <cstring>
#include <unordered_map>
using namespace std;
typedef struct letter_t *letter;
struct letter_t {
letter links[27];
uint32_t linksCount[27];
};
struct trie {
letter letters;
unordered_map<string, uint32_t> *buffer;
};
struct trie *init() {
struct trie *ssl = (struct trie *)malloc(sizeof(struct trie));
ssl->buffer = new unordered_map<string, uint32_t>();
ssl->letters = NULL;
return ssl;
}
letter let_init() {
letter self = (letter)malloc(sizeof(struct letter_t));
memset(self, 0, sizeof(struct letter_t));
return self;
}
letter insertWordInTrie_t(letter letters, const string &word, int8_t index) {
if(!letters) {
letters = let_init();
}
if(index >= word.size()) {
return letters;
}
char lett = word[index] - 'a';
letters->linksCount[lett]++;
letters->links[lett] = insertWordInTrie_t(letters->links[lett], word, index + 1);
return letters;
}
void insertWordInTrie(struct trie *self, const string &word) {
self->letters = insertWordInTrie_t(self->letters, word, 0);
}
void addWord(struct trie *self, const string &word) {
(*self->buffer)[word]++;
insertWordInTrie(self, word);
}
void removeFromTree_t(letter letters, const string &word, int8_t index) {
if(!letters) {
cout << "Something is wrong";
exit(0);
}
if(index >= word.size()) {
return ;
}
char lett = word[index] - 'a';
letters->linksCount[lett]--;
removeFromTree_t(letters->links[lett], word, index + 1);
}
void removeFromTree(struct trie *self, const string &word) {
removeFromTree_t(self->letters, word, 0);
}
void deleteWord(struct trie *self, const string &word) {
(*self->buffer)[word]--;
removeFromTree(self, word);
}
int32_t longestPrefix_t(letter letters, const string &word, uint32_t index) {
char lett = word[index] - 'a';
if(index >= word.size() || (!letters->linksCount[lett])) {
return 0;
}
return 1 + longestPrefix_t(letters->links[lett], word, index + 1);
}
int32_t longestPrefix(struct trie *self, const string &word) {
return longestPrefix_t(self->letters, word, 0);
}
int main() {
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
uint32_t a;
struct trie *self = init();
char tmp[101];
while(scanf("%d %100s", &a, &tmp) != EOF) {
string s = tmp;
switch (a)
{
case 0: ;
addWord(self, s);
break;
case 1: ;
deleteWord(self, s);
break;
case 2: ;
printf("%d\n", (*self->buffer)[s]);
break;
case 3: ;
printf("%d\n", longestPrefix(self, s));
//exit(0);
break;
default:
break;
}
}
return 0;
}