Cod sursa(job #2819782)

Utilizator GrandmasterSoucup Bogdan Grandmaster Data 19 decembrie 2021 00:44:03
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.7 kb

#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;
}