Advertisement
smatskevich

Seminar12

May 8th, 2023
605
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.85 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. #include <vector>
  5.  
  6. std::vector<int> ManacherOdd(const std::string& s) {
  7.   std::vector<int> result(s.size(), 1);
  8.   int l = 0, r = 1;
  9.   for (int i = 1; i < s.size(); ++i) {
  10.     // TODO: Сделать отдельную переменную для result[i].
  11.     if (i < r) {
  12.       int sym_index = l + r - i - 1;
  13.       result[i] = std::min(result[sym_index], r - i);
  14.     }
  15.     while (i + result[i] < s.size() && i - result[i] >= 0 && s[i + result[i]] == s[i - result[i]]) ++result[i];
  16.     if (i + result[i] > r) {
  17.       r = i + result[i];
  18.       l = i - result[i] + 1;
  19.     }
  20.   }
  21.   return result;
  22. }
  23.  
  24. int main1() {
  25.   std::string s;
  26.   std::cin >> s;
  27.   auto result = ManacherOdd(s);
  28.   for (int x : result) std::cout << x << " ";
  29.   std::cout << std::endl;
  30.   return 0;
  31. }
  32.  
  33. struct Node {
  34.   std::map<char, Node*> Go;
  35.   bool Terminal = false;
  36. };
  37. class Trie {
  38.  public:
  39.   Trie() : root(new Node) {}
  40.   // TODO: Destruct
  41.   void Add(const std::string& s);
  42.   void Print() const { std::string prefix; Print(prefix, root); }
  43.  private:
  44.   Node* root;
  45.   static void Print(std::string& prefix, Node* n);
  46. };
  47. void Trie::Add(const std::string& s) {
  48.   Node* current = root;
  49.   for (char c : s) {
  50.     if (auto it = current->Go.find(c); it != current->Go.end())
  51.       current = it->second;
  52.     else
  53.       current = current->Go[c] = new Node;
  54.   }
  55.   current->Terminal = true;
  56. }
  57.  
  58. void Trie::Print(std::string& prefix, Node* n) {
  59.   std::cout << prefix << (n->Terminal ? "\t\t - Terminal" : "") << "\n";
  60.   // if (n->Terminal) result.emplace_back(prefix);
  61.   for (auto [c, target] : n->Go) {
  62.     prefix.push_back(c);
  63.     Print(prefix, target);
  64.     prefix.pop_back();
  65.   }
  66. }
  67.  
  68. int main() {
  69.   Trie t;
  70.   t.Add("arc");
  71.   t.Add("b");
  72.   t.Add("car");
  73.   t.Add("c");
  74.   t.Add("cat");
  75.   t.Print();
  76.   return 0;
  77. }
  78.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement