第36647题 组合题
阅读程序(第一题):字符串哈希 + 二分求最长公共子串

阅读下面程序,完成后面的判断题和单选题。判断题正确填 A,错误填 B。程序每次读入两行不含空格的字符串(均由小写字母组成,长度不超过 100000)。

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>

typedef unsigned long long ull;
const int MAXN = 100005;
int n, m;
char A[MAXN], B[MAXN];
ull hA[MAXN], hB[MAXN], pw[MAXN];
const ull BASE = 131;

int check(int L) {
    std::vector<ull> v;
    for (int i = 0; i + L <= n; ++i)
        v.push_back(hA[i + L] - hA[i] * pw[L]);
    std::sort(v.begin(), v.end());
    for (int i = 0; i + L <= m; ++i) {
        ull t = hB[i + L] - hB[i] * pw[L];
        if (std::binary_search(v.begin(), v.end(), t))
            return 1;
    }
    return 0;
}

int main() {
    scanf("%s", A);
    scanf("%s", B);
    n = (int)strlen(A);
    m = (int)strlen(B);
    pw[0] = 1;
    for (int i = 1; i <= n || i <= m; ++i)
        pw[i] = pw[i - 1] * BASE;
    for (int i = 0; i < n; ++i)
        hA[i + 1] = hA[i] * BASE + A[i];
    for (int i = 0; i < m; ++i)
        hB[i + 1] = hB[i] * BASE + B[i];
    int l = 0, r = (n < m ? n : m);
    while (l < r) {
        int mid = (l + r + 1) / 2;
        if (check(mid))
            l = mid;
        else
            r = mid - 1;
    }
    printf("%d\n", l);
    return 0;
}
{{ option.label }}
子题{{ index + 1 }} {{ child.type_label }}
{{ option.label }}
✓ 正确 ◐ 部分正确 ✗ 错误
程序运行统计
暂无判题统计
知识点:
提交{{ questionInfo.stats ? questionInfo.stats.submit_count : 0 }}次 正确率{{ statsAccuracy }}%
答案解析