makut

ROMAN

Dec 20th, 2018
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.10 KB | None | 0 0
  1. //
  2. // Created by Роман Климовицкий on 2018-11-27.
  3. //
  4.  
  5. #include <iostream>
  6. #include <cmath>
  7. #include <string>
  8. #include <vector>
  9.  
  10.  
  11. std::string prefixFunction(const std::string& s) {
  12.     int len = s.size();
  13.     std::vector<int> p(len);
  14.     p[0] = 0;
  15.     for (int i = 1; i < len; ++i) {
  16.         int j = p[i - 1];
  17.         while (j > 0 && s[j] != s[i]) {
  18.             j = p[j - 1];
  19.         }
  20.         if (s[j] == s[i]) {
  21.             p[i] = j + 1;
  22.         } else {
  23.             p[i] = 0;
  24.         }
  25.     }
  26.     return s.substr(0, len - p[len - 1]);
  27. }
  28.  
  29.  
  30. std::vector<int> zFunction(const std::string& s) {
  31.     int len = s.size();
  32.     std::vector<int> z(len);
  33.     z[0] = len;
  34.     int l = 0;
  35.     int r = 0;
  36.     for (int i = 1; i < len; ++i) {
  37.         if (i > r) {
  38.             z[i] = 0;
  39.         } else {
  40.             z[i] = std::min(r - i + 1, z[i - l]);
  41.         }
  42.         while (i + z[i] < len && s[z[i]] == s[i + z[i]])
  43.             ++z[i];
  44.         if (i + z[i] - 1 > r) {
  45.             l = i;
  46.             r = i + z[i] - 1;
  47.         }
  48.     }
  49.     return z;
  50. }
  51.  
  52.  
  53. int main() {
  54.     std::ios::sync_with_stdio(false);
  55.     std::cin.tie(NULL);
  56.  
  57.     std::string s1, s2;
  58.     std::cin >> s1 >> s2;
  59.     int len1 = s1.size();
  60.     int len2 = s2.size();
  61.     std::string bigS = s2 + static_cast<char>(32) + s1;
  62.     std::string ans = bigS;
  63.     std::string tmpS = s1 + s2;
  64.  
  65.     tmpS = prefixFunction(s1 + s2);
  66.     if (tmpS.size() < ans.size()) {
  67.         ans.swap(tmpS);
  68.         if (ans.size() <= 2) {
  69.             std::cout << ans << std::endl;
  70.             return 0;
  71.         }
  72.     }
  73.  
  74.     std::vector<int> bigZF(len1 + len2 + 1);
  75.     bigZF[0] = len1 + len2 + 1;
  76.     int l = 0;
  77.     int r = 0;
  78.     for (int i = 1; i < len1 + len2 + 1; ++i) {
  79.         if (i > r) {
  80.             bigZF[i] = 0;
  81.         } else {
  82.             bigZF[i] = std::min(r - i + 1, bigZF[i - l]);
  83.         }
  84.         while (i + bigZF[i] < len1 + len2 + 1 && bigS[bigZF[i]] == bigS[i + bigZF[i]])
  85.             ++bigZF[i];
  86.         if (i + bigZF[i] - 1 > r) {
  87.             l = i;
  88.             r = i + bigZF[i] - 1;
  89.         }
  90.     }
  91.     for (int i = 1; i <= len1; ++i) {
  92.         if (bigZF[i + len2] == len2) {
  93.             tmpS = prefixFunction(s1);
  94.             if (tmpS.size() <= ans.size()) {
  95.                 std::cout << tmpS << std::endl;
  96.                 return 0;
  97.             }
  98.         }
  99.         if (i + bigZF[i + len2] - 1 == len1) {
  100.             tmpS = prefixFunction(s1 + s2.substr(bigZF[i + len2], len2 - bigZF[i + len2]));
  101.             if (tmpS.size() < ans.size()) {
  102.                 ans.swap(tmpS);
  103.                 if (ans.size() <= 2) {
  104.                     std::cout << ans << std::endl;
  105.                     return 0;
  106.                 }
  107.             }
  108.         }
  109.     }
  110.  
  111.     s1.swap(s2);
  112.  
  113.     len1 = s1.size();
  114.     len2 = s2.size();
  115.     bigS = s2 + static_cast<char>(32) + s1;
  116.     ans = bigS;
  117.     tmpS = s1 + s2;
  118.  
  119.     tmpS = prefixFunction(s1 + s2);
  120.     if (tmpS.size() < ans.size()) {
  121.         ans.swap(tmpS);
  122.         if (ans.size() <= 2) {
  123.             std::cout << ans << std::endl;
  124.             return 0;
  125.         }
  126.     }
  127.  
  128.     bigZF[0] = len1 + len2 + 1;
  129.     l = 0;
  130.     r = 0;
  131.     for (int i = 1; i < len1 + len2 + 1; ++i) {
  132.         if (i > r) {
  133.             bigZF[i] = 0;
  134.         } else {
  135.             bigZF[i] = std::min(r - i + 1, bigZF[i - l]);
  136.         }
  137.         while (i + bigZF[i] < len1 + len2 + 1 && bigS[bigZF[i]] == bigS[i + bigZF[i]])
  138.             ++bigZF[i];
  139.         if (i + bigZF[i] - 1 > r) {
  140.             l = i;
  141.             r = i + bigZF[i] - 1;
  142.         }
  143.     }
  144.     for (int i = 1; i <= len1; ++i) {
  145.         if (bigZF[i + len2] == len2) {
  146.             tmpS = prefixFunction(s1);
  147.             if (tmpS.size() <= ans.size()) {
  148.                 std::cout << tmpS << std::endl;
  149.                 return 0;
  150.             }
  151.         }
  152.         if (i + bigZF[i + len2] - 1 == len1) {
  153.             tmpS = prefixFunction(s1 + s2.substr(bigZF[i + len2], len2 - bigZF[i + len2]));
  154.             if (tmpS.size() < ans.size()) {
  155.                 ans.swap(tmpS);
  156.                 if (ans.size() <= 2) {
  157.                     std::cout << ans << std::endl;
  158.                     return 0;
  159.                 }
  160.             }
  161.         }
  162.     }
  163.  
  164.     std::cout << ans << std::endl;
  165.  
  166.  
  167.     return 0;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment