求助 20pts
查看原帖
求助 20pts
390770
S0CRiA楼主2021/10/31 21:25
//P7914
#include <bits/stdc++.h>
#define chk(a, b) ((a <= b) && (pre[b] - pre[a-1] == b - (a) + 1) && (b - (a) + 1 <= k))
#define cmp(a, b) ((a) == (b) || (a) == '?')
#define all(a, b) (f[a][b][0] + f[a][b][1])
#define upd(a, b) (a = ((a) + (b)) % P)
using namespace std;

const int N = 510, P = 1e9 + 7;
long long f[N][N][2], sum[N];
int n, k, pre[N], to[N];
bool vis[N][N];
char s[N];

void dfs(int l, int r){
	if(l >= r || vis[l][r]) return;
	vis[l][r] = true;
	
	if(cmp(s[l], '(') && cmp(s[r], ')')){
		if(l+1 == r)
			upd(f[l][r][1], 1);
			
		if(chk(l+1, r-1))
			upd(f[l][r][1], 1);
			
		dfs(l+1, r-1);
		upd(f[l][r][1], all(l+1, r-1));
		
		for(int i = l+1; i <= r-1; ++ i)
			if(chk(l+1, i))	
				dfs(i+1, r-1), 
				upd(f[l][r][1], all(i+1, r-1));
				
		for(int i = r-1; i >= l+1; -- i)
			if(chk(i, r-1))
				dfs(l+1, i-1),
				upd(f[l][r][1], all(l+1, i-1));
	}
	
	memset(sum, 0, sizeof(sum));
	for(int i = 1; i <= n; ++ i)
		dfs(i, r),
		sum[i] = (sum[i-1] + all(i, r)) % P;
	
	for(int i = l; i < r; ++ i){
		dfs(l, i), dfs(i+1, r),
		upd(f[l][r][0], f[l][i][1] * all(i+1, r));
		
		if(cmp(s[i], '*')){
			dfs(l, i-1);
			int j = min(r-1, min(i+k-1, to[i]));
			upd(f[l][r][0], f[l][i-1][1] * (sum[j+1]-sum[i]+P));
		}
	}
}

int main(){
	scanf("%d%d", &n, &k);
	scanf("%s", s+1);
	for(int i = 1; i <= n; ++ i) pre[i] = pre[i-1] + (cmp(s[i], '*') ? 1 : 0);
	for(int i = 1; i <= n; ++ i){ int j = i; while(cmp(s[j], '*')) ++j; to[i] = j-1; }
	memset(f, 0, sizeof(f)); memset(vis, 0, sizeof(vis));
	dfs(1, n);
	printf("%lld\n", (f[1][n][0] + f[1][n][1]) % P);
	return 0;
}
2021/10/31 21:25
加载中...