1 条题解

  • 0
    @ 2026-11-2 10:56:25

    卫星图像(Sateliti) 题解

    思路分析

    按题目要求使用对应数据结构与算法模拟/递推求解,注意数据范围边界与时间复杂度。

    参考代码

    #include <algorithm>
    #include <cstdint>
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    using ull = unsigned long long;
    const ull B1 = 131;
    const ull B2 = 13331;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int n, m;
        if (!(cin >> n >> m)) return 0;
        vector<string> g(2 * n);
        for (int i = 0; i < n; ++i) {
            string row;
            cin >> row;
            g[i] = row + row;
            g[i + n] = g[i];
        }
        int N = 2 * n, M = 2 * m;
        vector<ull> p1(M + 1, 1), p2(N + 1, 1);
        for (int j = 1; j <= M; ++j) p1[j] = p1[j - 1] * B1;
        for (int i = 1; i <= N; ++i) p2[i] = p2[i - 1] * B2;
    
        vector<vector<ull>> h(N + 1, vector<ull>(M + 1, 0));
        for (int i = 1; i <= N; ++i) {
            ull row_h = 0;
            for (int j = 1; j <= M; ++j) {
                row_h = row_h * B1 + (ull)g[i - 1][j - 1];
                h[i][j] = h[i - 1][j] * B2 + row_h;
            }
        }
    
        auto get_rect = [&](int r1, int c1, int r2, int c2) -> ull {
            // 0-indexed [r1..r2-1][c1..c2-1]
            ull res = h[r2][c2] - h[r1][c2] * p2[r2 - r1] - h[r2][c1] * p1[c2 - c1] + h[r1][c1] * p2[r2 - r1] * p1[c2 - c1];
            return res;
        };
    
        auto less_shift = [&](int rA, int cA, int rB, int cB) -> bool {
            if (get_rect(rA, cA, rA + n, cA + m) == get_rect(rB, cB, rB + n, cB + m)) return false;
            int lo = 1, hi = n, diff_r = n;
            while (lo <= hi) {
                int mid = (lo + hi) >> 1;
                if (get_rect(rA, cA, rA + mid, cA + m) == get_rect(rB, cB, rB + mid, cB + m)) {
                    lo = mid + 1;
                } else {
                    diff_r = mid - 1;
                    hi = mid - 1;
                }
            }
            lo = 1;
            hi = m;
            int diff_c = m;
            while (lo <= hi) {
                int mid = (lo + hi) >> 1;
                if (get_rect(rA + diff_r, cA, rA + diff_r + 1, cA + mid) == get_rect(rB + diff_r, cB, rB + diff_r + 1, cB + mid)) {
                    lo = mid + 1;
                } else {
                    diff_c = mid - 1;
                    hi = mid - 1;
                }
            }
            return g[rA + diff_r][cA + diff_c] < g[rB + diff_r][cB + diff_c];
        };
    
        int best_r = 0, best_c = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                if (i == 0 && j == 0) continue;
                if (less_shift(i, j, best_r, best_c)) {
                    best_r = i;
                    best_c = j;
                }
            }
        }
    
        for (int i = 0; i < n; ++i) {
            cout << g[best_r + i].substr(best_c, m) << "\n";
        }
        return 0;
    }
    
    • 1

    信息

    ID
    8582
    时间
    3000ms
    内存
    512MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者