请求加强数据
查看原帖
请求加强数据
207996
yzy1Ẽd<ßDream楼主2021/10/24 13:13

RT,O(n4)O(n^4) 没有经过任何卡常,做法得了 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;
}
2021/10/24 13:13
加载中...