Hack & 数据过水
查看原帖
Hack & 数据过水
756066
chk_die楼主2023/7/15 17:43
input:
1
ex
w?q
w
answer:
0

仅有的一篇题解输出了 −1-1。


由于数据过水,导致我和题解的代码都可以通过此题,但是随便一拍就不一样。附我的代码,欢迎找错。

#include <bits/stdc++.h>
#define int long long
using namespace std;

int read() {
	int s = 0, f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9')
		f = (ch == '-' ? -1 : 1), ch = getchar();
	while (ch >= '0' && ch <= '9')
		s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
	return s * f;
}

const int mod = 1000000009;

int n;
char s[3][1000005];
int len[3], a[3][1000005];
int dp[1000005][2][2] = {{{0}}};

int work() {
	for (int i = 1; i <= n; i++) {
		int v1 = 0, v2 = 0, v3 = 0, v4 = 0, v10 = 0, v11 = 0, v20 = 0, v21 = 0, all = 1;
		for (int j = 0; j < 3; j++)
			if (a[j][i] == -1)
				all *= 26;
		if (a[0][i] == -1 && a[1][i] == -1 && a[2][i] == -1) {
			v1 = 26 * 25 * 24 / 6, v2 = v3 = 26 * 25 / 2, v4 = 26;
			v10 = v20 = 26 * 26, v11 = v21 = 26 * 25 / 2 * 26;
		}
		if (a[0][i] != -1 && a[1][i] == -1 && a[2][i] == -1) {
			v1 = (25 - a[0][i]) * (24 - a[0][i]) / 2, v2 = v3 = 25 - a[0][i], v4 = 1;
			v10 = 26, v11 = (25 - a[0][i]) * 26, v20 = 26, v21 = 26 * 25 / 2;
		}
		if (a[0][i] == -1 && a[1][i] != -1 && a[2][i] == -1) {
			v1 = a[1][i] * (25 - a[1][i]), v2 = 25 - a[1][i], v3 = a[1][i], v4 = 1;
			v10 = 26, v11 = a[1][i] * 26, v20 = 26, v21 = (25 - a[1][i]) * 26;
		}
		if (a[0][i] == -1 && a[1][i] == -1 && a[2][i] != -1) {
			v1 = a[2][i] * (a[2][i] - 1) / 2, v2 = v3 = a[2][i], v4 = 1;
			v10 = 26, v11 = 26 * 25 / 2, v20 = 26, v21 = a[2][i] * 26;
		}
		if (a[0][i] != -1 && a[1][i] != -1 && a[2][i] == -1) {
			bool le = a[0][i] < a[1][i], eq = a[0][i] == a[1][i];
			v1 = le * (25 - a[1][i]), v2 = eq * (25 - a[1][i]), v3 = le, v4 = eq;
			v10 = eq * 26, v11 = le * 26, v20 = 1, v21 = (25 - a[1][i]);
		}
		if (a[0][i] != -1 && a[1][i] == -1 && a[2][i] != -1) {
			bool le = a[0][i] < a[2][i], eq = a[0][i] == a[2][i];
			v1 = le * (a[2][i] - a[0][i] - 1), v2 = v3 = le, v4 = eq;
			v10 = 1, v11 = 25 - a[0][i], v20 = 1, v21 = a[2][i];
		}
		if (a[0][i] == -1 && a[1][i] != -1 && a[2][i] != -1) {
			bool le = a[1][i] < a[2][i], eq = a[1][i] == a[2][i];
			v1 = le * a[1][i], v2 = le, v3 = eq * a[1][i], v4 = eq;
			v10 = 1, v11 = a[1][i], v20 = eq * 26, v21 = le * 26;
		}
		if (a[0][i] != -1 && a[1][i] != -1 && a[2][i] != -1) {
			bool eq1 = a[0][i] == a[1][i], le1 = a[0][i] < a[1][i], eq2 = a[1][i] == a[2][i], le2 = a[1][i] < a[2][i];
			v1 = le1 && le2, v2 = eq1 && le2, v3 = le1 && eq2, v4 = eq1 && eq2;
			v10 = eq1, v11 = le1, v20 = eq2, v21 = le2;
		}
		dp[i][1][1] = dp[i - 1][1][1] * v4 % mod;
		dp[i][0][1] = (dp[i - 1][0][1] * v20 % mod + dp[i - 1][1][1] * v3 % mod) % mod;
		dp[i][1][0] = (dp[i - 1][1][0] * v10 % mod + dp[i - 1][1][1] * v2 % mod) % mod;
		dp[i][0][0] = (dp[i - 1][1][1] * v1 % mod + dp[i - 1][1][0] * v11 % mod + dp[i - 1][0][1] * v21 % mod + dp[i - 1][0][0] * all % mod) % mod;
	}
	int cnt = 0, mx = 0;
	for (int i = 0; i < 3; i++) {
		len[i] -= n, cnt += len[i] > 0, mx = len[i] > len[mx] ? i : mx;
		for (int j = 1; j <= len[i]; j++)
			a[i][j] = a[i][j + n];
	}
	if (!cnt)
		return dp[n][0][0];
	if (cnt == 1) {
		int ans = dp[n][0][0];
		if (len[1] > 0)
			ans = (ans + dp[n][1][0]) % mod;
		if (len[2] > 0)
			ans = (ans + dp[n][0][1]) % mod;
		for (int i = n + 1; i <= len[mx]; i++)
			if (a[mx][i] == -1)
				ans = ans * 26 % mod;
		return ans;
	}
	int res[2][2];
	for (int i = 0; i < 2; i++)
		for (int j = 0; j < 2; j++)
			res[i][j] = dp[n][i][j];
	if (len[0] <= 0) {
		n = len[0] = min(len[1], len[2]);
		for (int i = 1; i <= len[1]; i++)
			a[0][i] = 0;
		dp[0][0][0] = (res[0][0] + res[1][0]) % mod, dp[0][1][0] = dp[0][1][1] = 0, dp[0][0][1] = (res[0][1] + res[1][1]) % mod;
	}
	else if (len[1] <= 0) {
		swap(len[0], len[1]), swap(a[0], a[1]);
		n = len[0] = min(len[1], len[2]);
		for (int i = 1; i <= len[1]; i++)
			a[0][i] = 0;
		dp[0][0][0] = (res[0][0] + res[0][1]) % mod, dp[0][1][0] = dp[0][1][1] = dp[0][0][1] = 0;
	}
	else {
		swap(len[1], len[2]), swap(a[1], a[2]), swap(len[0], len[1]), swap(a[0], a[1]);
		n = len[0] = min(len[1], len[2]);
		for (int i = 1; i <= len[1]; i++)
			a[0][i] = 0;
		dp[0][0][0] = res[0][0], dp[0][1][0] = dp[0][1][1] = 0, dp[0][0][1] = res[1][0];
	}
	work();
	int ans = dp[n][0][0] + dp[n][1][0];
	if (len[1] < len[2])
		ans = (ans + dp[n][0][1] + dp[n][1][1]) % mod, swap(len[1], len[2]), swap(a[1], a[2]);
	for (int i = 1; i <= len[1]; i++)
		if (a[1][i] == -1)
			ans = ans * 26 % mod;
	return ans;
}

signed main() {
	int T = read();
	while (T--) {
		scanf("%s\n%s\n%s", s[0] + 1, s[1] + 1, s[2] + 1);
		n = 1e9;
		for (int i = 0; i < 3; i++)
			len[i] = strlen(s[i] + 1), n = min(n, len[i]);
		for (int i = 0; i < 3; i++)
			for (int j = 1; j <= len[i]; j++)
				a[i][j] = s[i][j] == '?' ? -1 : s[i][j] - 'a';
		dp[0][1][1] = 1, dp[0][0][0] = dp[0][1][0] = dp[0][0][1] = 0;
		printf("%lld\n", work());
	}
	return 0;
}
2023/7/15 17:43
加载中...