求助,10pts,后缀写挂了
查看原帖
求助,10pts,后缀写挂了
173864
NaN_HQJ2007_NaN楼主2021/11/4 21:14
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 500 + 5;
const ll mod = 1e9 + 7;
ll n, k, f[N][N][3], ok[N][N], sum[N];
string s;
int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> n >> k >> s;
	s = "." + s + ".";
	for (int i = 1; i <= n; ++i) {
		for (int j = i; j <= i + k - 1 && j <= n; ++j) {
			if (s[j] == '*' || s[j] == '?') ok[i][j] = 1;
			else break;
		}
	}
	for (int j = 2; j <= n; ++j) {
		for (int l = 1; l + j - 1 <= n; ++l) {
			int r = l + j - 1;
			if ((s[l] != '(' && s[l] != '?') || (s[r] != ')' && s[r] != '?')) continue;
			if (j == 2) {//()
				f[l][r][1] = 1;
				continue;
			}
			//(...)
			f[l][r][1] = ok[l + 1][r - 1];//(S)
			f[l][r][1] = (f[l][r][1] + f[l + 1][r - 1][1] + f[l + 1][r - 1][2]) % mod;//(A)
			for (int i = l + 1; i <= l + 1 + k - 1 && i <= r - 3; ++i) f[l][r][1] = (f[l][r][1] + ok[l + 1][i] * (f[i + 1][r - 1][1] + f[i + 1][r - 1][2])) % mod;//(SA)
			for (int i = r - 1; i >= r - 1 - k + 1 && i >= l + 3; --i) f[l][r][1] = (f[l][r][1] + ok[i][r - 1] * (f[l + 1][i - 1][1] + f[l + 1][i - 1][2])) % mod;//(AS)
			//(...)...(...)
			for (int i = l + 1; i <= r - 2; ++i) f[l][r][2] = (f[l][r][2] + f[l][i][1] * (f[i + 1][r][1] + f[i + 1][r][2])) % mod;//AB
			ll cnt = 0;
			memset(sum, 0, sizeof(0));
			for (int i = r; i >= l; --i) {
				if (s[i + 1] != '?' && s[i + 1] != '*') cnt = 0;
				else if (cnt < k) {
					if (i + 2 > r) continue;
					sum[i] = (sum[i + 1] + f[i + 2][r][1] + f[i + 2][r][2]) % mod;
					++cnt;
				} else {
					sum[i] = (sum[i + 1] + f[i + 2][r][1] + f[i + 2][r][2] - f[i + 2 + k][r][1] - f[i + 2 + k][r][2] + mod) % mod;
				}
			}
			for (int i = l + 1; i <= r - 3; ++i) {//ASB
				f[l][r][2] = (f[l][r][2] + f[l][i][1] * sum[i]) % mod;
			}
		}
	}
	cout << (f[1][n][1] + f[1][n][2]) % mod << endl;
	return 0;
}

2021/11/4 21:14
加载中...