QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#200656#7051. Largest Common SubmatrixwjwHHHWA 0ms3608kbC++205.0kb2023-10-04 18:12:442023-10-04 18:12:44

Judging History

你现在查看的是最新测评结果

  • [2023-10-04 18:12:44]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3608kb
  • [2023-10-04 18:12:44]
  • 提交

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 = 13331, 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] * p1[b.first - a.first] % M) * p2[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 = 13331, 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] * p1[b.first - a.first] % M) * p2[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];
        }
    }
    auto check=[&](pair<int,int>x,pair<int,int> y,pair<int,int>xx,pair<int,int>yy)
    {
        for(int i=x.first,ii=y.first;i<=xx.first;i++,ii++)
        {
            for(int j=x.second,jj=y.second;j<=xx.second;j++,jj++)
            {
                if(a[i][j]!=b[ii][jj])return false;
            }
        }
        return true;
    };
    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 (check(pair(i,j),pair(rx,ry),pair(i,j+mid-1),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 (check(pair(i,j),pair(rx,ry),pair(i+mid-1,j+len-1),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: 3608kb

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: 3532kb

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: 3572kb

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'