Advertisement
Guest User

Untitled

a guest
May 23rd, 2014
543
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define ll long long
  4. #define ull unsigned long long
  5.  
  6. using namespace std;
  7.  
  8. const int MXN = 250250;
  9. const int INF = 1000 * 1000 * 1000 + 7;
  10.  
  11. char a[MXN], b[MXN];
  12.  
  13. int alen, blen, st, n;
  14. ull pp[MXN], h1[MXN], h2[MXN];
  15.  
  16. ull gethash1(int l, int r)
  17. {
  18.     ull ret;
  19.     if (l)
  20.         ret = ((h1[r] - h1[l - 1]) * 1ULL * pp[n - r]);
  21.     else
  22.         ret = (h1[r] * 1ULL * pp[n - r]);
  23.  
  24.     return ret;
  25. }
  26.  
  27. ull gethash2(int l, int r)
  28. {
  29.     ull ret;
  30.     if (l)
  31.         ret = ((h2[r] - h2[l - 1]) * 1ULL * pp[n - r]);
  32.     else
  33.         ret = (h2[r] * 1ULL * pp[n - r]);
  34.  
  35.     return ret;
  36. }
  37.  
  38. bool check(int len)
  39. {
  40.     unordered_set<ull> mp;
  41.     for (int i = 0; i < alen - len + 1; i++)
  42.         mp.insert(gethash1(i, i + len - 1));
  43.  
  44.     for (int i = 0; i < blen - len + 1; i++) {
  45.         if (mp.find(gethash2(i, i + len - 1)) != mp.end()) {
  46.             st = i;
  47.             return true;
  48.         }
  49.     }
  50.  
  51.     return false;
  52. }
  53.  
  54. int main()
  55. {
  56.     scanf("%s", &a);
  57.     scanf("%s", &b);
  58.  
  59.     alen = strlen(a);
  60.     blen = strlen(b);
  61.  
  62.     n = alen;
  63.  
  64.     pp[0] = 1;
  65.     for (int i = 1; i <= n; i++)
  66.         pp[i] = (pp[i - 1] * 37ULL);
  67.  
  68.     for (int i = 0; i < alen; i++) {
  69.         if (i)
  70.             h1[i] = h1[i - 1];
  71.  
  72.         h1[i] += (1ULL * (a[i] - 'a' + 1) * pp[i]);
  73.     }
  74.  
  75.     for (int i = 0; i < blen; i++) {
  76.         if (i)
  77.             h2[i] = h2[i - 1];
  78.  
  79.         h2[i] += (1ULL * (b[i] - 'a' + 1) * pp[i]);
  80.     }
  81.  
  82.     int l = 0,
  83.         r = blen + 1;
  84.  
  85.     while (r - l > 1)
  86.     {
  87.         int m = (l + r) >> 1;
  88.         if (check(m))
  89.             l = m;
  90.         else
  91.             r = m;
  92.     }
  93.     for (int i = st; i < st + l; i++)
  94.         printf("%c", b[i]);
  95.  
  96.     if (l > 0)
  97.         printf("\n");
  98.  
  99.     printf("%d", l);
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement