Advertisement
paranid5

PZDC

Oct 28th, 2020
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <tuple>
  5.  
  6. int main()
  7. {
  8.     std::ios_base::sync_with_stdio(false);
  9.     std::cin.tie(nullptr);
  10.     std::cout.tie(nullptr);
  11.    
  12.     std::string input;
  13.     std::cin >> input;
  14.  
  15.     if (input.length() < 2)
  16.         return 0;
  17.  
  18.     const int size = input.length();
  19.  
  20.     std::vector<std::vector<std::tuple<std::string, bool, int, int>>> memo (
  21.         size,                                                                 // размер
  22.     std::vector<std::tuple<std::string, bool, int, int>> (                // храним строку, корректность, правую и левую границы
  23.             size,                                                                      
  24.         std::make_tuple("", false, 1000, -1)
  25.         )
  26.     );
  27.  
  28.     for (int i = 0, q = 0; i < size; i++, q++)
  29.     {
  30.         std::get<0>(memo[i][q]).push_back(input[i]);
  31.         std::get<2>(memo[i][q]) = i;
  32.         std::get<3>(memo[i][q]) = q;
  33.     }
  34.  
  35.     for (int r = 1; r < size; r++) // диагонали
  36.     {
  37.         for (int i = 0, q = r; q < size; i++, q++) // обход по-диагонали
  38.         {
  39.             std::string best;
  40.             bool correct = false;
  41.             int right = 1000, left = -1;
  42.            
  43.             for (int s = 1; s <= r; s++) // обход по-верху
  44.             {
  45.                 for (int d = 0; d < s; d++) // обход по-низу
  46.                 {
  47.                     if (std::get<1>(memo[i][q - s])) // 1 корректна
  48.                     {
  49.                         if (std::get<1>(memo[i + r - d][q])) // 2 корректна
  50.                         {
  51.                             if (std::get<0>(memo[i + r - d][q]).length() + std::get<0>(memo[i][q - s]).length() >= best.length())
  52.                             {
  53.                                 best = std::get<0>(memo[i][q - s]) + std::get<0>(memo[i + r - d][q]);
  54.                                 right = i; left = q;
  55.                                 correct = true;
  56.                             }
  57.                         }
  58.  
  59.                         else if (std::get<0>(memo[i][q - s]).length() >= best.length()) // 2 не корректна
  60.                         {
  61.                             best = std::get<0>(memo[i][q - s]);
  62.                             right = std::get<2>(memo[i][q - s]);
  63.                             left = std::get<3>(memo[i][q - s]);
  64.                             correct = true;
  65.                         }
  66.                     }
  67.  
  68.                     else if (std::get<1>(memo[i + r - d][q])) // 1 не корректна, 2 корректна
  69.                     {
  70.                         if (std::get<0>(memo[i + r - d][q]).length() >= best.length())
  71.                         {
  72.                             best = std::get<0>(memo[i + r - d][q]);
  73.                             right = std::get<2>(memo[i + r - d][q]);
  74.                             left = std::get<3>(memo[i + r - d][q]);
  75.                             correct = true;
  76.                         }
  77.                     }
  78.  
  79.                     else // обе не корректны
  80.                     {
  81.                         std::cout << "PIZDA " << i << " " << q - s << " " << i + r - d << " " << q << '\n';
  82.                        
  83.                         auto check = [&memo, &i, &q, &s, &r, &d, &best, &correct, &left, &right](const char ch1, const char ch2) // чекаем скобки
  84.                         {
  85.                             if (std::get<0>(memo[i][q - s]).back() == ch1 && std::get<0>(memo[i + r - d][q]).back() == ch2)
  86.                             {
  87.                                 std::cout << "OK1 " << i << " " << q - s << " " << i + r - d << " " << q << '\n';
  88.                                
  89.                                 if (std::get<2>(memo[i][q - s]) < right && std::get<3>(memo[i + r - d][q]) > left)
  90.                                 {
  91.                                     best = std::get<0>(memo[i][q - s]) + best + std::get<0>(memo[i + r - d][q]);
  92.                                     right = std::get<2>(memo[i][q - s]);
  93.                                     left = std::get<3>(memo[i + r - d][q]);
  94.                                     correct = true;
  95.  
  96.                                     std::cout << "OK2 " << i << " " << q - s << " " << i + r - d << " " << q << '\n';
  97.                                 }
  98.                             }
  99.                         };
  100.  
  101.                         if (!std::get<0>(memo[i][q - s]).empty() && !std::get<0>(memo[i + r - d][q]).empty())
  102.                         {
  103.                             if (std::get<0>(memo[i][q - s]).front() == '(') check('(', ')');
  104.                             else if (std::get<0>(memo[i][q - s]).front() == '{') check('{', '}');
  105.                             else check('[', ']');
  106.                         }
  107.                     }
  108.                 }
  109.             }
  110.  
  111.             std::get<0>(memo[i][q]) = std::move(best);
  112.             std::get<1>(memo[i][q]) = correct;
  113.             std::get<2>(memo[i][q]) = right;
  114.             std::get<3>(memo[i][q]) = left;
  115.         }
  116.     }
  117.  
  118.     std::cout << std::get<0>(memo[0][size - 1]);
  119.  
  120.     return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement