救救孩子吧,死活也调不出来啊
  • 板块灌水区
  • 楼主z_y_
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/9/19 20:41
  • 上次更新2023/11/2 19:04:12
查看原帖
救救孩子吧,死活也调不出来啊
556472
z_y_楼主2023/9/19 20:41

SP1811

这道题调了一天了,所有的样例和自造数据都能过,但死活都是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;
}
2023/9/19 20:41
加载中...