这道题调了一天了,所有的样例和自造数据都能过,但死活都是WA。有大佬能帮孩子调一下吗,悬赏一关注。
代码:
#include <iostream>
#include <cstring>
#include <bitset>
using namespace std;
const int base = 2333, mod = 1e9 + 7, MAXN = 3e5;
typedef long long ll;
int n, m, ans;
ll inv, pw[MAXN], ipw[MAXN], H1[MAXN], H2[MAXN];
struct node {
ll val;
bool typ;
};
node a[MAXN << 1];
string s, t;
bitset < mod + 10 > vis;
ll qpow(int p) {
ll res = 1, x = base;
while (p) {
if (p & 1)
res *= x, res %= mod;
x *= x, x %= mod;
p >>= 1;
}
return res;
}
bool check(int len) {
for (int i = len; i <= n; i++) {
vis[((H1[i] - H1[i - len] + mod)*ipw[i - len]) % mod] =
1; //算出长度为len的子串的哈希值,丢到桶里
}
for (int i = len; i <= m; i++)
if (vis[((H2[i] - H2[i - len] + mod)*ipw[i - len]) % mod]) { //看桶内是否有一样的哈希值
for (int j = len; j <= n; j++) //清空桶
vis[((H1[j] - H1[j - len] + mod)*ipw[j - len]) % mod] = 0;
return 1;
}
for (int i = len; i <= n; i++)
vis[((H1[i] - H1[i - len] + mod)*ipw[i - len]) % mod] = 0;
return 0;
}
int main() {
cin >> s >> t;
s = " " + s;
t = " " + t;
n = s.length() - 1;
m = t.length() - 1;
inv = qpow(mod - 2);
ipw[0] = pw[0] = 1;
for (int i = 1; i <= max(n, m); i++) {
pw[i] = pw[i - 1] * base, pw[i] %= mod;
ipw[i] = ipw[i - 1] * inv, ipw[i] %= mod; //求逆元
}
for (int i = 1; i <= n; i++)
H1[i] = (H1[i - 1] + pw[i] * s[i] % mod) % mod; //求hash值
for (int i = 1; i <= m; i++)
H2[i] = (H2[i - 1] + pw[i] * t[i] % mod) % mod;
int L = 0, R = min(n, m);
ans = 0;
while (L <= R) { //二分答案
int mid = (L + R) >> 1;
if (check(mid)) {
L = mid + 1;
ans = mid;
} else
R = mid - 1;
}
printf("%d\n", ans);
cin >> s >> t;
return 0;
}