阅读下面程序,完成后面的判断题和单选题。判断题正确填 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;
}