Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // Created by Роман Климовицкий on 2018-11-27.
- //
- #include <iostream>
- #include <cmath>
- #include <string>
- #include <vector>
- std::string prefixFunction(const std::string& s) {
- int len = s.size();
- std::vector<int> p(len);
- p[0] = 0;
- for (int i = 1; i < len; ++i) {
- int j = p[i - 1];
- while (j > 0 && s[j] != s[i]) {
- j = p[j - 1];
- }
- if (s[j] == s[i]) {
- p[i] = j + 1;
- } else {
- p[i] = 0;
- }
- }
- return s.substr(0, len - p[len - 1]);
- }
- std::vector<int> zFunction(const std::string& s) {
- int len = s.size();
- std::vector<int> z(len);
- z[0] = len;
- int l = 0;
- int r = 0;
- for (int i = 1; i < len; ++i) {
- if (i > r) {
- z[i] = 0;
- } else {
- z[i] = std::min(r - i + 1, z[i - l]);
- }
- while (i + z[i] < len && s[z[i]] == s[i + z[i]])
- ++z[i];
- if (i + z[i] - 1 > r) {
- l = i;
- r = i + z[i] - 1;
- }
- }
- return z;
- }
- int main() {
- std::ios::sync_with_stdio(false);
- std::cin.tie(NULL);
- std::string s1, s2;
- std::cin >> s1 >> s2;
- int len1 = s1.size();
- int len2 = s2.size();
- std::string bigS = s2 + static_cast<char>(32) + s1;
- std::string ans = bigS;
- std::string tmpS = s1 + s2;
- tmpS = prefixFunction(s1 + s2);
- if (tmpS.size() < ans.size()) {
- ans.swap(tmpS);
- if (ans.size() <= 2) {
- std::cout << ans << std::endl;
- return 0;
- }
- }
- std::vector<int> bigZF(len1 + len2 + 1);
- bigZF[0] = len1 + len2 + 1;
- int l = 0;
- int r = 0;
- for (int i = 1; i < len1 + len2 + 1; ++i) {
- if (i > r) {
- bigZF[i] = 0;
- } else {
- bigZF[i] = std::min(r - i + 1, bigZF[i - l]);
- }
- while (i + bigZF[i] < len1 + len2 + 1 && bigS[bigZF[i]] == bigS[i + bigZF[i]])
- ++bigZF[i];
- if (i + bigZF[i] - 1 > r) {
- l = i;
- r = i + bigZF[i] - 1;
- }
- }
- for (int i = 1; i <= len1; ++i) {
- if (bigZF[i + len2] == len2) {
- tmpS = prefixFunction(s1);
- if (tmpS.size() <= ans.size()) {
- std::cout << tmpS << std::endl;
- return 0;
- }
- }
- if (i + bigZF[i + len2] - 1 == len1) {
- tmpS = prefixFunction(s1 + s2.substr(bigZF[i + len2], len2 - bigZF[i + len2]));
- if (tmpS.size() < ans.size()) {
- ans.swap(tmpS);
- if (ans.size() <= 2) {
- std::cout << ans << std::endl;
- return 0;
- }
- }
- }
- }
- s1.swap(s2);
- len1 = s1.size();
- len2 = s2.size();
- bigS = s2 + static_cast<char>(32) + s1;
- ans = bigS;
- tmpS = s1 + s2;
- tmpS = prefixFunction(s1 + s2);
- if (tmpS.size() < ans.size()) {
- ans.swap(tmpS);
- if (ans.size() <= 2) {
- std::cout << ans << std::endl;
- return 0;
- }
- }
- bigZF[0] = len1 + len2 + 1;
- l = 0;
- r = 0;
- for (int i = 1; i < len1 + len2 + 1; ++i) {
- if (i > r) {
- bigZF[i] = 0;
- } else {
- bigZF[i] = std::min(r - i + 1, bigZF[i - l]);
- }
- while (i + bigZF[i] < len1 + len2 + 1 && bigS[bigZF[i]] == bigS[i + bigZF[i]])
- ++bigZF[i];
- if (i + bigZF[i] - 1 > r) {
- l = i;
- r = i + bigZF[i] - 1;
- }
- }
- for (int i = 1; i <= len1; ++i) {
- if (bigZF[i + len2] == len2) {
- tmpS = prefixFunction(s1);
- if (tmpS.size() <= ans.size()) {
- std::cout << tmpS << std::endl;
- return 0;
- }
- }
- if (i + bigZF[i + len2] - 1 == len1) {
- tmpS = prefixFunction(s1 + s2.substr(bigZF[i + len2], len2 - bigZF[i + len2]));
- if (tmpS.size() < ans.size()) {
- ans.swap(tmpS);
- if (ans.size() <= 2) {
- std::cout << ans << std::endl;
- return 0;
- }
- }
- }
- }
- std::cout << ans << std::endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment