Advertisement
makinotori14

хэши пацанские

Nov 6th, 2023 (edited)
650
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.99 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3.  
  4. using namespace std;
  5. using namespace __gnu_pbds;
  6.  
  7. using ll = long long;
  8. using ld = long double;
  9. using ull = unsigned long long;
  10. using pii = pair<int, int>;
  11.  
  12. const int base1 = 30;
  13. const int base2 = 31;
  14.  
  15. ull ubinpow(ull x, int p) {
  16.     ull ans = 1;
  17.     while (p) {
  18.         if (p & 1)
  19.             ans *= x;
  20.         x *= x;
  21.         p >>= 1;
  22.     }
  23.     return ans;
  24. }
  25.  
  26. struct Coord {
  27.     int x, y;
  28. };
  29.  
  30. void solve() {
  31.     int n, m;
  32.     cin >> n >> m;
  33.     vector<vector<char>> a(n, vector<char>(m));
  34.     vector<vector<ull>> h(n + 1, vector<ull>(m + 1));
  35.  
  36.     for (int i = 0; i < n; ++i) {
  37.         for (int j = 0; j < m; ++j) {
  38.             cin >> a[i][j];
  39.         }
  40.     }
  41.  
  42.     for (int i = 1; i <= n; ++i) {
  43.         for (int j = 1; j <= m; ++j) {
  44.             int v = a[i - 1][j - 1] - 'a';
  45.             h[i][j] = h[i - 1][j] * base1 + h[i][j - 1] * base2 - h[i - 1][j - 1] * base1 * base2 + v;
  46.         }
  47.     }
  48.  
  49.     gp_hash_table<ull, Coord> found;
  50.  
  51.     for (int k = min(n, m); k >= 1; --k) {
  52.         for (int i = k; i <= n; ++i) {
  53.             for (int j = k; j <= m; ++j) {
  54.                 ull cur_hash = h[i][j] - h[i - k][j] * ubinpow(base1, k) - h[i][j - k] * ubinpow(base2, k);
  55.                 cur_hash += h[i - k][j - k] * ubinpow(base1 * base2, k);
  56.  
  57.                 if (found.find(cur_hash) != found.end()) {
  58.                     Coord crd = found[cur_hash];
  59.                     int x = crd.x;
  60.                     int y = crd.y;
  61.  
  62.                     cout << k << '\n';
  63.                     cout << x - k + 1 << ' ' << y - k + 1 << '\n';
  64.                     cout << i - k + 1 << ' ' << j - k + 1 << '\n';
  65.                     return;
  66.                 }
  67.                 found[cur_hash] = {i, j};
  68.             }
  69.         }
  70.     }
  71.  
  72.     cout << 0 << '\n';
  73. }
  74.  
  75. signed main() {
  76.     ios_base::sync_with_stdio(false);
  77.     cin.tie(nullptr);
  78.     int t = 1;
  79.     //cin >> t;
  80.     while (t--) {
  81.         solve();
  82.     }
  83. }
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement