求卡常
查看原帖
求卡常
448887
cancan123456楼主2021/11/10 15:18
#include <cstdio>
using namespace std;
typedef long long ll;
ll mod = 1000000007LL;
char s[505];
ll f[505][505], g[505][505], fsum[505][505];
// fsum[i][j] = f[i][j] + f[i + 1][j] + ... + f[n][j]
bool X[505][505];
bool is_left_bracket[505], is_right_bracket[505];
int R[505];
int min(int a, int b) {
	return a < b ? a : b;
}
int max(int a, int b) {
	return a > b ? a : b;
}
int main() {
	int n, k;
	scanf("%d %d\n", &n, &k);
	for (int i = 1; i <= n; i++) {
		s[i] = getchar();
		if (s[i] == '?' || s[i] == '(') {
			is_left_bracket[i] = true;
		}
		if (s[i] == '?' || s[i] == ')') {
			is_right_bracket[i] = true;
		}
	}
	for (int i = 1; i <= n; i++) {
		X[i][i - 1] = true;
	}
	for (int i = 1; i <= n; i++) {
		if (s[i] == '*' || s[i] == '?') {
			X[i][i] = true;
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = i + 1; j <= min(n, i + k); j++) {
			if (s[j] == '*' || s[j] == '?') {
				X[i][j] = X[i][j - 1];
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		while (X[i][i + R[i]] && R[i] < k) {
			R[i]++;
		}
	}
	for (int l = 1; l < n; l++) {
		if (is_left_bracket[l] && is_right_bracket[l + 1]) {
			f[l][l + 1] = 1LL;
			fsum[l][l + 1] = 1LL;
		}
	}
	for (int len = 3; len <= n; len++) {
		for (int l = 1; l <= n - len + 1; l++) {
			int r = l + len - 1;
			if (is_left_bracket[l] && is_right_bracket[r]) {
				// (S)
				if (len - 2 <= k && X[l + 1][r - 1]) {
					f[l][r] = (f[l][r] + 1LL) % mod;
				}
				// (A)
				f[l][r] = (f[l][r] + f[l + 1][r - 1] + g[l + 1][r - 1]) % mod;
				// (SA)
				for (int l2 = l + 1; l2 <= min(r - 2, l + k); l2++) {
					if (X[l + 1][l2]) {
						f[l][r] = (f[l][r] + f[l2 + 1][r - 1] + g[l2 + 1][r - 1]) % mod;
					}
				}
				// (AS)
				for (int r2 = r - 1; r2 >= max(l + 2, r - k); r2--) {
					if (X[r2][r - 1]) {
						f[l][r] = (f[l][r] + f[l + 1][r2 - 1] + g[l + 1][r2 - 1]) % mod;
					}
				}
				// AB & ASB
				for (int i = l + 1; i < r; i++) {
					g[l][r] = (g[l][r] + (f[l][i] + g[l][i]) * (fsum[i + 2][r] - fsum[min(i + 1 + R[i + 1], r - 1) + 1][r] + f[i + 1][r] + mod) % mod) % mod;
				}
			}
			fsum[l][r] = (fsum[l + 1][r] + f[l][r]) % mod;
		}
	}
	printf("%lld", (f[1][n] + g[1][n]) % mod);
	return 0;
}
2021/11/10 15:18
加载中...