Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <math.h>
- #include <algorithm>
- #include <vector>
- #include <cstring>
- #include <iomanip>
- #include <map>
- #include <set>
- #define F first
- #define S second
- using namespace std;
- //const unsigned long long m = 2971215073;
- const unsigned long long pp = 1031;
- const unsigned long long pp1 = 237;
- //vector <unsigned long long> a1, a2, h1, h2, p;
- unsigned long long a1[100009], a2[100009];
- pair <unsigned long long, unsigned long long> h1[100009], h2[100009], p[100009];
- //set <pair <unsigned long long, unsigned long long> > t;
- pair <unsigned long long, unsigned long long> t[100009];
- unsigned long long n;
- pair <long long, long long> ans = make_pair(-1, -1);
- pair <unsigned long long, unsigned long long> has(unsigned long long l, unsigned long long r, bool s)
- {
- if (!s)
- // return (((h1[r] - ((((!l ? 0 : h1[l - 1]) * p[r - l + 1]) % m) + m) % m) % m) + m) % m;
- return make_pair(h1[r].F - (!l ? 0 : h1[l - 1].F) * p[r - l + 1].F, h1[r].S - (!l ? 0 : h1[l - 1].S) * p[r - l + 1].S);
- else
- //return (((h2[r] - ((((!l ? 0 : h2[l - 1]) * p[r - l + 1]) % m) + m) % m) % m) + m) % m;
- return make_pair(h2[r].F - (!l ? 0 : h2[l - 1].F) * p[r - l + 1].F, h2[r].S - (!l ? 0 : h2[l - 1].S) * p[r - l + 1].S);
- }
- bool f(long long k)
- {
- //t.clear();
- pair<unsigned long long, unsigned long long> h;
- for (long long i = 0; i + k < n; i++)
- {
- //cout << i << " " << k << endl;
- h = has(i, i + k, 0);
- //t.insert(h);
- t[i] = h;
- //else
- }
- sort(t, t + n - k + 1);
- // for (set<unsigned long long>::const_iterator it = t.begin(); it != t.end(); ++it)
- // cout << *it << " ";
- //cout << endl;
- for (long long i = 0; i + k < n; i++)
- {
- h = has(i, i + k, 1);
- //t.insert(h);
- //cout << h << " ";
- //if (t.find(h) != t.end())
- if (t[lower_bound(t, t + n - k + 1, h) - t] == h)
- //if (t.size() == r)
- {
- //cout << k << " " << ans.F << endl;
- //if (k < ans.F)
- // cout << "*" << endl;
- if (k > ans.F)
- {
- ans.F = k;
- ans.S = i;
- }
- return true;
- }
- }//cout << endl;
- return false;
- }
- int main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);
- //freopen("floyd.in", "r", stdin);freopen("floyd.out", "w", stdout);
- cin >> n;
- //p.resize(n);
- //h1.resize(n);
- //h2.resize(n);
- char d;
- for (long long i = 0; i < n; i++)
- {
- cin >> d;
- //a1.push_back(d - 'A' + 1);
- a1[i] = d - 'A' + 1;
- }
- for (long long i = 0; i < n; i++)
- {
- cin >> d;
- //a2.push_back(d - 'A' + 1);
- a2[i] = d - 'A' + 1;
- }
- // p[0] = pp;
- p[0].F = 1;
- p[0].S = 1;
- for (long long i = 1; i < n; i++)
- //p[i] = (((p[i - 1] * pp) % m) + m) % m;
- p[i] = make_pair(p[i - 1].F * pp, p[i - 1].S * pp1);
- // for (unsigned long long i = 0; i < n; i++)
- // cout << p[i] << " ";
- h1[0] = make_pair(a1[0], a1[0]);
- // cout << h1[0] << " ";
- for (long long i = 1; i < n; i++)
- {
- // h1[i] = (((h1[i - 1] * pp + a1[i]) % m) + m) % m;
- h1[i] = make_pair(h1[i - 1].F * pp + a1[i], h1[i - 1].S * pp1 + a1[i]);
- // cout << h1[i] << " ";
- }
- h2[0] = make_pair(a2[0], a2[0]);
- for (long long i = 1; i < n; i++)
- {
- //h2[i] = (((h2[i - 1] * pp + a2[i]) % m) + m) % m;
- h2[i] = make_pair(h2[i - 1].F * pp + a2[i], h2[i - 1].S * pp1 + a2[i]);
- }
- long long l = -1, r = n, m = 0;
- while (l + 1 < r)
- {
- m = (l + r) / 2;
- if (f(m))
- l = m;
- else
- r = m;
- }
- //cout << ans.F << " " << ans.S << endl;
- for (long long i = ans.S; i <= ans.S + ans.F; i++)
- cout << (char)(a2[i] + 'A' - 1);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement