Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <algorithm>
- #include <cstdlib>
- #include <cstring>
- #include <string>
- #include <vector>
- #include <map>
- #include <set>
- #include <cmath>
- #include <ctime>
- #include <cassert>
- using namespace std;
- #define pb push_back
- #define mp make_pair
- #define sz(A) (int)(A).size()
- typedef long long LL;
- typedef long double LD;
- const int MOD = int(1e12 + 7), P = 239017, L = int(1e5 + 5);
- int len, pos_ans[4], add_right[4], out[4];
- char s[2][L], ans[4][2][L];
- LL p[L], h[2][L], rh[2][L];
- void precalc() {
- for (int k = 0; k < 4; k++)
- for (int i = 0; i < 2; i++)
- for (int j = 0; j < len; j++)
- ans[k][i][j] = '.';
- p[0] = 1;
- for (int i = 1; i < L; i++)
- p[i] = (p[i - 1] * P) % MOD;
- for (int j = 0; j < 2; j++) {
- h[j][0] = s[j][0];
- for (int i = 1; i < len; i++)
- h[j][i] = (h[j][i - 1] * P + s[j][i]) % MOD;
- }
- for (int j = 0; j < 2; j++) {
- rh[j][len - 1] = s[j][len - 1];
- for (int i = len - 2; i >= 0; i--)
- rh[j][i] = (rh[j][i + 1] * P + s[j][i]) % MOD;
- }
- }
- LL count_hash(int num, int l, int r) {
- if (!l)
- return h[num][r];
- LL val = h[num][r] - h[num][l - 1] * p[r - l + 1];
- if (val < 0)
- val += MOD;
- val %= MOD;
- return val;
- }
- LL count_rev_hash(int num, int l, int r) {
- LL val = rh[num][l] - rh[num][r + 1] * p[r - l + 1];
- if (val < 0)
- val += MOD;
- val %= MOD;
- return val;
- }
- int main()
- {
- // freopen(".in", "r", stdin);
- // freopen(".out", "w", stdout);
- scanf("%d\n", &len);
- gets(s[0]);
- gets(s[1]);
- precalc();
- // odd, center in the first row
- int l = 0, r = len;
- while (l + 1 < r) {
- int mid = (l + r) / 2;
- bool ok = 0;
- for (int i = mid; i < len; i++) {
- int l_ = 0, r_ = mid + 1;
- while (l_ + 1 < r_) {
- int mid_ = (l_ + r_) / 2;
- if (count_hash(0, i + 1, i + mid_) == count_rev_hash(0, i - mid_, i - 1))
- l_ = mid_;
- else
- r_ = mid_;
- }
- // if (i == 3)
- // cerr << count_rev_hash(0, i - mid, i - l_ - 1) << " " << count_hash(1, i + l_, i + mid - 1) << endl;
- int rest = mid - l_;
- if (count_rev_hash(0, i - mid, i - l_ - 1) == count_hash(1, i + l_, i + mid - 1)) {
- ok = 1;
- pos_ans[0] = i;
- add_right[0] = l_;
- break;
- }
- }
- if (ok)
- l = mid;
- else
- r = mid;
- }
- out[0] = 2 * l + 1;
- for (int i = pos_ans[0] - l; i <= pos_ans[0] + add_right[0]; i++)
- ans[0][0][i] = s[0][i];
- for (int i = pos_ans[0] + add_right[0]; i < pos_ans[0] + l; i++)
- ans[0][1][i] = s[1][i];
- l = 0, r = len;
- while (l + 1 < r) {
- int mid = (l + r) / 2;
- bool ok = 0;
- for (int i = 0; i + mid < len; i++) {
- int l_ = 0, r_ = mid + 1;
- while (l_ + 1 < r_) {
- int mid_ = (l_ + r_) / 2;
- if (count_hash(1, i + 1, i + mid_) == count_rev_hash(1, i - mid_, i - 1))
- l_ = mid_;
- else
- r_ = mid_;
- }
- // if (i == 3)
- // cerr << count_rev_hash(0, i - mid, i - l_ - 1) << " " << count_hash(1, i + l_, i + mid - 1) << endl;
- int rest = mid - l_;
- if (count_rev_hash(0, i - mid + 1, i - l_) == count_hash(1, i + l_ + 1, i + mid)) {
- ok = 1;
- pos_ans[1] = i;
- add_right[1] = l_;
- break;
- }
- }
- if (ok)
- l = mid;
- else
- r = mid;
- }
- out[1] = 2 * l + 1;
- for (int i = pos_ans[1] - l + 1; i <= pos_ans[1] - add_right[1]; i++)
- ans[1][0][i] = s[0][i];
- for (int i = pos_ans[1] - add_right[1]; i <= pos_ans[1] + l; i++)
- ans[1][1][i] = s[1][i];
- l = 0, r = len + 1;
- while (l + 1 < r) {
- int mid = (l + r) / 2;
- bool ok = 0;
- for (int i = mid - 1; i < len; i++) {
- int l_ = 0, r_ = mid + 1;
- while (l_ + 1 < r_) {
- int mid_ = (l_ + r_) / 2;
- if (count_hash(0, i + 1, i + mid_) == count_rev_hash(0, i - mid_ + 1, i))
- l_ = mid_;
- else
- r_ = mid_;
- }
- int rest = mid - l_;
- if (count_rev_hash(0, i - mid + 1, i - l_) == count_hash(1, i + l_, i + mid - 1)) {
- ok = 1;
- pos_ans[2] = i;
- add_right[2] = l_;
- break;
- }
- }
- if (ok)
- l = mid;
- else
- r = mid;
- }
- // printf("%d\n", 2 * l);
- out[2] = 2 * l;
- for (int i = pos_ans[2] - l + 1; i <= pos_ans[2] + add_right[2]; i++)
- ans[2][0][i] = s[0][i];
- for (int i = pos_ans[2] + add_right[2]; i < pos_ans[2] + l; i++)
- ans[2][1][i] = s[1][i];
- // for (int i = 0; i < 2; i++, printf("\n"))
- // for (int j = 0; j < len; j++)
- // printf("%c", ans[2][i][j]);
- // even, center in the second row
- l = 0, r = len + 1;
- while (l + 1 < r) {
- int mid = (l + r) / 2;
- bool ok = 0;
- for (int i = 0; i + mid <= len; i++) {
- int l_ = 0, r_ = mid + 1;
- while (l_ + 1 < r_) {
- int mid_ = (l_ + r_) / 2;
- if (count_hash(1, i, i + mid_ - 1) == count_rev_hash(1, i - mid_, i - 1))
- l_ = mid_;
- else
- r_ = mid_;
- }
- int rest = mid - l_;
- if (count_rev_hash(0, i - mid + 1, i - l_) == count_hash(1, i + l_, i + mid - 1)) {
- ok = 1;
- pos_ans[3] = i;
- add_right[3] = l_;
- break;
- }
- }
- if (ok)
- l = mid;
- else
- r = mid;
- }
- out[3] = 2 * l;
- for (int i = pos_ans[3] - l + 1; i <= pos_ans[3] - add_right[3]; i++)
- ans[3][0][i] = s[0][i];
- for (int i = pos_ans[3] - add_right[3]; i <= pos_ans[3] + l - 1; i++)
- ans[3][1][i] = s[1][i];
- int mx = -1, ind = -1;
- for (int i = 0; i < 4; i++)
- if (out[i] > mx) {
- mx = out[i];
- ind = i;
- }
- printf("%d\n", mx);
- for (int i = 0; i < 2; i++, printf("\n"))
- for (int j = 0; j < len; j++)
- printf("%c", ans[ind][i][j]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement