Advertisement
double_trouble

Untitled

Oct 22nd, 2015
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.05 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <math.h>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <cstring>
  7. #include <iomanip>
  8. #include <map>
  9. #include <set>
  10.  
  11. #define F first
  12. #define S second
  13.  
  14. using namespace std;
  15.  
  16. //const unsigned long long m = 2971215073;
  17. const unsigned long long pp = 1031;
  18. const unsigned long long pp1 = 237;
  19.  
  20. //vector <unsigned long long> a1, a2, h1, h2, p;
  21. unsigned long long a1[100009], a2[100009];
  22. pair <unsigned long long, unsigned long long> h1[100009], h2[100009], p[100009];
  23. //set <pair <unsigned long long, unsigned long long> > t;
  24. pair <unsigned long long, unsigned long long> t[100009];
  25. unsigned long long n;
  26. pair <long long, long long> ans = make_pair(-1, -1);
  27.  
  28. pair <unsigned long long, unsigned long long> has(unsigned long long l, unsigned long long r, bool s)
  29. {
  30.     if (!s)
  31.        // return (((h1[r] - ((((!l ? 0 : h1[l - 1]) * p[r - l + 1]) % m) + m) % m) % m) + m) % m;
  32.         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);
  33.     else
  34.         //return (((h2[r] - ((((!l ? 0 : h2[l - 1]) * p[r - l + 1]) % m) + m) % m) % m) + m) % m;
  35.         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);
  36. }
  37.  
  38. bool f(long long k)
  39. {
  40.     //t.clear();
  41.     pair<unsigned long long, unsigned long long> h;
  42.     for (long long i = 0; i + k < n; i++)
  43.     {
  44.         //cout << i << " " << k << endl;
  45.         h = has(i, i + k, 0);
  46.         //t.insert(h);
  47.         t[i] = h;
  48.         //else
  49.     }
  50.  
  51.     sort(t, t + n - k + 1);
  52.  
  53. //    for (set<unsigned long long>::const_iterator it = t.begin(); it != t.end(); ++it)
  54.   //      cout << *it << " ";
  55.     //cout << endl;
  56.  
  57.     for (long long i = 0; i + k < n; i++)
  58.     {
  59.         h = has(i, i + k, 1);
  60.         //t.insert(h);
  61.         //cout << h << " ";
  62.  
  63.         //if (t.find(h) != t.end())
  64.  
  65.         if (t[lower_bound(t, t + n - k + 1, h) - t] == h)
  66.  
  67.         //if (t.size() == r)
  68.         {
  69.             //cout << k  << " " << ans.F << endl;
  70.             //if (k < ans.F)
  71.               //  cout << "*" << endl;
  72.             if (k > ans.F)
  73.             {
  74.                 ans.F = k;
  75.                 ans.S = i;
  76.             }
  77.             return true;
  78.         }
  79.  
  80.     }//cout << endl;
  81.  
  82.     return false;
  83. }
  84.  
  85. int main()
  86. {
  87.     ios_base::sync_with_stdio(0);
  88.     cin.tie(0);
  89.     cout.tie(0);
  90.     freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);
  91.     //freopen("floyd.in", "r", stdin);freopen("floyd.out", "w", stdout);
  92.  
  93.  
  94.     cin >> n;
  95.  
  96.     //p.resize(n);
  97.     //h1.resize(n);
  98.     //h2.resize(n);
  99.  
  100.     char d;
  101.  
  102.     for (long long i = 0; i < n; i++)
  103.     {
  104.         cin >> d;
  105.         //a1.push_back(d - 'A' + 1);
  106.         a1[i] = d - 'A' + 1;
  107.     }
  108.     for (long long i = 0; i < n; i++)
  109.     {
  110.         cin >> d;
  111.         //a2.push_back(d - 'A' + 1);
  112.         a2[i] = d - 'A' + 1;
  113.     }
  114.  
  115.  
  116.    // p[0] = pp;
  117.    p[0].F = 1;
  118.    p[0].S = 1;
  119.     for (long long i = 1; i < n; i++)
  120.         //p[i] = (((p[i - 1] * pp) % m) + m) % m;
  121.         p[i] = make_pair(p[i - 1].F * pp, p[i - 1].S * pp1);
  122.  
  123.   //  for (unsigned long long i = 0; i < n; i++)
  124.     //    cout << p[i] << " ";
  125.  
  126.     h1[0] = make_pair(a1[0], a1[0]);
  127.    // cout << h1[0] << " ";
  128.     for (long long i = 1; i < n; i++)
  129.     {
  130.        // h1[i] = (((h1[i - 1] * pp + a1[i]) % m) + m) % m;
  131.         h1[i] = make_pair(h1[i - 1].F * pp + a1[i], h1[i - 1].S * pp1 + a1[i]);
  132.        // cout << h1[i] << " ";
  133.     }
  134.  
  135.     h2[0] = make_pair(a2[0], a2[0]);
  136.     for (long long i = 1; i < n; i++)
  137.     {
  138.         //h2[i] = (((h2[i - 1] * pp + a2[i]) % m) + m) % m;
  139.         h2[i] = make_pair(h2[i - 1].F * pp + a2[i], h2[i - 1].S * pp1 + a2[i]);
  140.     }
  141.     long long l = -1, r = n, m = 0;
  142.     while (l + 1 < r)
  143.     {
  144.         m = (l + r) / 2;
  145.         if (f(m))
  146.             l = m;
  147.         else
  148.             r = m;
  149.     }
  150.  
  151.     //cout << ans.F << " " << ans.S << endl;
  152.  
  153.     for (long long i = ans.S; i <= ans.S + ans.F; i++)
  154.         cout << (char)(a2[i] + 'A' - 1);
  155.  
  156.     return 0;
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement