QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#200649 | #7051. Largest Common Submatrix | wjwHHH | WA | 0ms | 3836kb | C++20 | 5.1kb | 2023-10-04 18:11:12 | 2023-10-04 18:11:12 |
Judging History
answer
#include <bits/stdc++.h>
#define dug(x) cerr << "死了吧小丑" << x << endl
using namespace std;
using i64 = long long;
template <class T> void chmax(T &a, T b)
{
a > b ? (a = a) : (a = b);
}
template <class T> void chmin(T &a, T b)
{
a > b ? (a = b) : (a = a);
}
struct twostring_hash // 下标从0开始
{
// using ui64 = unsigned long long;
const int M = 1e9 + 7;
i64 base1, base2;
vector<i64> p1, p2;
vector<vector<i64>> h;
twostring_hash(vector<vector<int>> &a)
{
int n = a.size(), m = a[0].size();
init(n, m);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
h[i][j] = (h[i][j - 1] * base1 % M + a[i - 1][j - 1]) % M;
for (int j = 1; j <= m; j++)
for (int i = 1; i <= n; i++)
{
h[i][j] += h[i - 1][j] * base2 % M;
h[i][j] %= M;
}
}
void init(int l, int r, i64 b1 = 1331, i64 b2 = 131)
{
base1 = b1, base2 = b2;
p1.resize(l + 1);
p2.resize(r + 1);
p1[0] = p2[0] = 1;
for (int i = 1; i <= l; i++)
p1[i] = p1[i - 1] * b1 % M;
for (int i = 1; i <= r; i++)
p2[i] = p2[i - 1] * b2 % M;
h.resize(l + 1, vector<i64>(r + 1));
}
i64 get(pair<int, int> a, pair<int, int> b)
{
b.first++, b.second++;
return (h[b.first][b.second] - h[a.first][b.second] * p2[b.first - a.first] % M -
h[b.first][a.second] * p1[b.second - a.second] % M +
(h[a.first][a.second] * p2[b.first - a.first] % M) * p1[b.second - a.second] + M) %
M;
}
};
struct tstring_hash // 下标从0开始
{
// using ui64 = unsigned long long;
const int M = 998244353;
i64 base1, base2;
vector<i64> p1, p2;
vector<vector<i64>> h;
tstring_hash(vector<vector<int>> &a)
{
int n = a.size(), m = a[0].size();
init(n, m);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
h[i][j] = (h[i][j - 1] * base1 % M + a[i - 1][j - 1]) % M;
for (int j = 1; j <= m; j++)
for (int i = 1; i <= n; i++)
{
h[i][j] += h[i - 1][j] * base2 % M;
h[i][j] %= M;
}
}
void init(int l, int r, i64 b1 = 1331, i64 b2 = 131)
{
base1 = b1, base2 = b2;
p1.resize(l + 1);
p2.resize(r + 1);
p1[0] = p2[0] = 1;
for (int i = 1; i <= l; i++)
p1[i] = p1[i - 1] * b1 % M;
for (int i = 1; i <= r; i++)
p2[i] = p2[i - 1] * b2 % M;
h.resize(l + 1, vector<i64>(r + 1));
}
i64 get(pair<int, int> a, pair<int, int> b)
{
b.first++, b.second++;
return (h[b.first][b.second] - h[a.first][b.second] * p2[b.first - a.first] % M -
h[b.first][a.second] * p1[b.second - a.second] % M +
(h[a.first][a.second] * p2[b.first - a.first] % M) * p1[b.second - a.second] + M) %
M;
}
};
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout << setprecision(15) << fixed;
int n, m;
cin >> n >> m;
vector<vector<int>> a(n, vector<int>(m));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> a[i][j];
}
}
vector<vector<int>> b(n, vector<int>(m));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> b[i][j];
}
}
twostring_hash ha(a), hb(b);
tstring_hash hha(a), hhb(b);
map<int, pair<int, int>> mp;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
mp[b[i][j]] = pair(i, j);
}
}
i64 ans = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
auto [rx, ry] = mp[a[i][j]];
int l = 1, r = min(m - ry, m - j);
while (l < r)
{
int mid = l + r + 1 >> 1;
if (ha.get(pair(i, j), pair(i, j + mid - 1)) == hb.get(pair(rx, ry), pair(rx, ry + mid - 1)) &&
hha.get(pair(i, j), pair(i, j + mid - 1)) == hhb.get(pair(rx, ry), pair(rx, ry + mid - 1)))
l = mid;
else
r = mid - 1;
}
int len = l;
l = 1, r = min(n - rx, n - i);
while (l < r)
{
int mid = l + r + 1 >> 1;
if (ha.get(pair{i, j}, pair(i + mid - 1, j + len - 1)) ==
hb.get(pair(rx, ry), pair(rx + mid - 1, ry + len - 1)) &&
hha.get(pair{i, j}, pair(i + mid - 1, j + len - 1)) ==
hhb.get(pair(rx, ry), pair(rx + mid - 1, ry + len - 1)))
l = mid;
else
r = mid - 1;
}
//if(len*l!=1)cout<<a[i][j]<<endl;
chmax(ans, 1ll * len * l);
}
}
cout << ans << endl;
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3636kb
input:
3 4 5 6 7 8 1 2 3 4 9 10 11 12 5 6 8 7 1 2 4 3 12 11 10 9
output:
4
result:
ok 1 number(s): "4"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3836kb
input:
10 10 13 2 57 50 1 28 37 87 30 46 66 47 33 69 83 52 97 55 91 18 9 48 23 35 98 8 7 95 90 5 3 53 43 36 96 59 26 4 70 17 71 100 15 94 25 72 84 89 21 73 64 34 22 29 42 92 85 78 86 62 99 79 67 11 6 19 24 51 77 74 75 16 88 44 93 39 41 82 56 65 12 40 63 54 10 60 32 45 20 80 49 61 76 14 81 68 27 31 58 38 13...
output:
100
result:
ok 1 number(s): "100"
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 3556kb
input:
10 10 6 48 98 83 7 56 22 49 61 34 8 87 91 100 16 17 86 24 9 23 94 50 81 59 51 21 52 20 33 25 73 1 70 45 36 31 88 90 12 69 64 57 60 5 85 29 37 96 92 41 89 67 79 84 35 68 46 18 38 63 27 55 65 95 11 43 47 72 80 66 75 39 58 62 77 53 15 40 3 71 32 82 10 99 44 2 30 76 74 28 19 78 13 97 26 42 54 14 4 93 6 ...
output:
60
result:
wrong answer 1st numbers differ - expected: '80', found: '60'