RT,O(n4) 没有经过任何卡常,做法得了 90pt,非常离谱。
const int N = 509;
const int mo = 1e9 + 7;
int n, f[N][N], m, qzh[N], g[N][N];
char s[N];
inline int Ck(int l, int r) { return qzh[r] - qzh[l - 1] == r - l + 1; }
signed main() {
// const int TL = 1, TR = 7;
in(n)(m)(s + 1);
re (i, n)
qzh[i] = qzh[i - 1] + (s[i] == '?' || s[i] == '*');
rep (len, 2, n) {
re (l, n) {
int r = l + len - 1;
if (r > n) break;
if ((s[l] == '(' || s[l] == '?') && (s[r] == ')' || s[r] == '?')) {
// () & (S)
if (Ck(l + 1, r - 1) && r - 1 - (l + 1) + 1 <= m) {
++f[l][r], umod(f[l][r]), ++g[l][r], umod(g[l][r]);
}
// if (l == TL && r == TR) dbg(f[l][r]);
// (A)
f[l][r] += f[l + 1][r - 1], umod(f[l][r]);
g[l][r] += f[l + 1][r - 1], umod(g[l][r]);
// if (l == TL && r == TR) dbg(f[l][r]);
// (SA)
rep (k, l + 1, r - 2) {
// [l+1, k] S
// [k+1, r-1] A
if (!Ck(l + 1, k)) break;
if (k - (l + 1) + 1 > m) break;
f[l][r] += f[k + 1][r - 1], umod(f[l][r]);
g[l][r] += f[k + 1][r - 1], umod(g[l][r]);
}
// if (l == TL && r == TR) dbg(f[l][r]);
// (AS)
per (k, r - 2, l + 1) {
// [l+1, k] A
// [k+1, r-1] S
if (!Ck(k + 1, r - 1)) break;
if (r - 1 - (k + 1) + 1 > m) break;
f[l][r] += f[l + 1][k], umod(f[l][r]);
g[l][r] += f[l + 1][k], umod(g[l][r]);
}
// if (l == TL && r == TR) dbg(f[l][r]);
}
// AB
rep (k, l, r - 1) {
// [l,k] A
// [k+1,r] B
f[l][r] += 1ll * f[l][k] * g[k + 1][r] % mo, umod(f[l][r]);
}
// if (l == TL && r == TR) dbg(f[l][r]);
// ASB
rep (k, l, r - 1) {
rep (k2, k + 1, r - 1) {
// [l,k] A
// [k+1,k2] S
// [k2+1,r] B
if (!Ck(k + 1, k2)) break;
if (k2 - (k + 1) + 1 > m) break;
f[l][r] += 1ll * f[l][k] * g[k2 + 1][r] % mo, umod(f[l][r]);
}
}
// cerr << l << ' ' << r << ' ' << f[l][r] << '\n';
}
}
out(f[1][n]);
return 0;
}