我们可以算出 T 的长度, T 肯定是由 a 个 S 和 S 的一个前缀构成 (a 可以为 0 )其中 a≤n ,我们可以得到 S ,T 的哈希值,把 f(S,T,X) 和 f(S,T,Y) 哈希出来 比较是否相等, 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;
}