另一个做法(过80tps 为什么超时 )
查看原帖
另一个做法(过80tps 为什么超时 )
1372776
Gmj2020楼主2024/11/6 17:03

我们可以算出 TT 的长度, TT 肯定是由 aaSSSS 的一个前缀构成 (aa 可以为 00 )其中 ana\leq n ,我们可以得到 SSTT 的哈希值,把 f(S,T,X)f(S,T,X)f(S,T,Y)f(S,T,Y) 哈希出来 比较是否相等, O(n)O(n) 但超时了 ??

#include <bits/stdc++.h>
using namespace std;
const int N = 1e7 + 100, P = 13331;
int T;
char s[N], t[N];
char x[N], y[N];
unsigned long long p[N];
unsigned long long Has_s, Has_t, Hx, Hy;
void solve() {
    cin >> (s + 1) >> (x + 1) >> (y + 1);
    int n1 = strlen(x + 1);
    int n2 = strlen(y + 1);
    Has_s = Has_t = Hx = Hy = 0;
    // cout<<n1<<" "<<n2<<'\n';
    int a1, a2, b1, b2;
    a1 = a2 = b1 = b2 = 0;
    for (int i = 1; i <= n1; i++) {
        if (x[i] == '0')
            a1++;
        else
            b1++;
    }
    for (int i = 1; i <= n2; i++) {
        if (y[i] == '0')
            a2++;
        else
            b2++;
    }
    long long l = strlen(s + 1);
    long long L = -1;
    if (1ll * (a1 - a2) * (b2 - b1) < 0) {
        puts("No");
        return;
    } else if (1ll * (a1 - a2) * (b2 - b1) == 0) {
        if (a1 - a2 != 0) {
            puts("No");
            return;
        } else {
            puts("Yes");
            return;
        }
    } else {
        if (1ll * l * (a1 - a2) % (b2 - b1)) {
            puts("No");
            return;
        } else
            L = 1ll * l * (a1 - a2) / (b2 - b1);
    }
    if (L <= l) {
        for (int i = 1; i <= L; i++) Has_t = Has_t * P + s[i];
        for (int i = 1; i <= l; i++) Has_s = Has_s * P + s[i];

        for (int i = 1; i <= n1; i++) {
            if (x[i] == '0')
                Hx = Hx * p[l] + Has_s;
            else
                Hx = Hx * p[L] + Has_t;
        }
        for (int i = 1; i <= n2; i++) {
            if (y[i] == '0')
                Hy = Hy * p[l] + Has_s;
            else
                Hy = Hy * p[L] + Has_t;
        }
        if (Hx == Hy)
            puts("Yes");
        else
            puts("No");
    } else {
        for (int i = 1; i <= l; i++) Has_s = Has_s * P + s[i];
        long long cl = L / l;
        for (int i = 1; i <= cl; i++) Has_t = Has_t * p[l] + Has_s;
        for (int i = 1; i <= L % l; i++) Has_t = Has_t * P + s[i];

        for (int i = 1; i <= n1; i++) {
            if (x[i] == '0')
                Hx = Hx * p[l] + Has_s;
            else
                Hx = Hx * p[L] + Has_t;
        }
        for (int i = 1; i <= n2; i++) {
            if (y[i] == '0')
                Hy = Hy * p[l] + Has_s;
            else
                Hy = Hy * p[L] + Has_t;
        }
        if (Hx == Hy)
            puts("Yes");
        else
            puts("No");
    }
}
int main() {
    freopen("B.in", "r", stdin);
    freopen("B.out", "w", stdout);
    p[0] = 1;
    for (int i = 1; i <= 5e6; i++) p[i] = p[i - 1] * P;
    cin >> T;
    while (T--) solve();
    return 0;
}
2024/11/6 17:03
加载中...