Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <iomanip>
- #include <set>
- #include <queue>
- #include <map>
- #include <string>
- #include <algorithm>
- #include <random>
- #include <math.h>
- //#pragma GCC optimize("OFast", "O3", "unroll-loops", "omit-frame-pointer", "inline");
- //#pragma GCC target("sse", "sse2", "sse3", "ssse3", "sse4", popcnt, abm, mmx, avx);
- //#pragma GCC option("tune=native", "arch=native", "no-zero-upper");
- //#pragma clang loop vectorize_width(4) interleave_count(4);
- //#pragma clang loop unroll(disable);
- using namespace std;
- const int INF = 1e9;
- const long long mod = 1e9 + 7;
- const long long lmod = 31;
- const double delta = 10e-18;
- vector<unsigned long long> step(1, 1);
- int getNum(char num) {
- return (num - 'A' + 1);
- }
- unsigned long long getHash(vector<unsigned long long> & hash, int l, int r) {
- return (hash[r + 1] - (hash[l] * step[r - l + 1]));
- }
- int main() {
- string s1, s2;
- int nn;
- cin >> nn;
- cin >> s1;
- cin >> s2;
- vector<unsigned long long> hash1(1);
- vector<unsigned long long> hash2(1);
- for (int i = 0; i < s1.size(); i++) {
- hash1.push_back(hash1[i] * lmod + getNum(s1[i]));
- step.push_back(step[i] * lmod);
- }
- for (int i = 0; i < s2.size(); i++) {
- hash2.push_back(hash2[i] * lmod + getNum(s2[i]));
- }
- int l = 0;
- int r = hash1.size();
- while (l + 1 < r) {
- int m = (l + r) / 2;
- bool f = true;
- set<unsigned long long> se;
- for (int i = 0; i + m < hash1.size() - 1; i++) {
- se.insert(getHash(hash1, i, i + m));
- }
- for (int i = 0; i + m < hash2.size() - 1; i++) {
- if (se.find(getHash(hash2, i, i + m)) != se.end()) {
- l = m;
- f = false;
- break;
- }
- }
- if (f)
- r = m;
- }
- set<unsigned long long> se;
- for (int i = 0; i + l < hash1.size() - 1; i++) {
- se.insert(getHash(hash1, i, i + l));
- }
- int lg, rg;
- for (int i = 0; i + l < hash2.size() - 1; i++) {
- if (se.find(getHash(hash2, i, i + l)) != se.end()) {
- lg = i;
- rg = i + l;
- }
- }
- string ans;
- for (int i = lg; i <= rg; i += 1)
- ans += s2[i];
- cout << ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement