如题,我甚至闲着没事干加了 check() 函数
#include <iostream>
#include <stack>
#include <cstring>
//#pragma GCC optimize (2)
typedef long long LL;
using namespace std;
const LL N = 1e5 + 10;
const LL mod = 12345678910;
LL n;
LL a[N];
stack<LL> s;
int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') { f = (ch == '-' ? -1 : f); ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
}
int check(int &x, int l, int r) {
//()() || (())
if (r - l + 1 == 4) {
if (a[l] == 0 && a[l + 1] == 1 && a[l + 2] == 0 && a[l + 3] == 1) return (x = 2);
if (a[l] == 0 && a[l + 1] == 0 && a[l + 2] == 1 && a[l + 3] == 1) return (x = 2);
}
//()()() || ((())) || (()()) || (())()
if (r - l + 1 == 6) {
if (!a[l] && a[l + 1] && !a[l + 2] && a[l + 3] && !a[l + 4] && a[l + 5]) return (x = 3);
if (!a[l] && !a[l + 1] && !a[l + 2] && a[l + 3] && a[l + 4] && a[l + 5]) return (x = 4);
if (!a[l] && !a[l + 1] && a[l + 2] && !a[l + 3] && a[l + 4] && a[l + 5]) return (x = 4);
if (!a[l] && !a[l + 1] && a[l + 2] && a[l + 3] && !a[l + 4] && a[l + 5]) return (x = 3);
}
//()()()() || (()()()) || (()())() || ()(()()) || ((())()) || (())()() || ()(())() || ()()(())
if (r - l + 1 == 8) {
if (!a[l] && a[l + 1] && !a[l + 2] && a[l + 3] && !a[l + 4] && a[l + 5] && !a[l + 6] && a[l + 7]) return (x = 4);
if (!a[l] && !a[l + 1] && a[l + 2] && !a[l + 3] && a[l + 4] && !a[l + 5] && a[l + 6] && a[l + 7]) return (x = 6);
if (!a[l] && !a[l + 1] && a[l + 2] && !a[l + 3] && a[l + 4] && a[l + 5] && !a[l + 6] && a[l + 7]) return (x = 5);
if (!a[l] && a[l + 1] && !a[l + 2] && !a[l + 3] && a[l + 4] && !a[l + 5] && a[l + 6] && a[l + 7]) return (x = 5);
if (!a[l] && !a[l + 1] && !a[l + 2] && a[l + 3] && a[l + 4] && !a[l + 5] && a[l + 6] && a[l + 7]) return (x = 6);
if (!a[l] && !a[l + 1] && a[l + 2] && a[l + 3] && !a[l + 4] && a[l + 5] && !a[l + 6] && a[l + 7]) return (x = 4);
if (!a[l] && a[l + 1] && !a[l + 2] && !a[l + 3] && a[l + 4] && a[l + 5] && !a[l + 6] && a[l + 7]) return (x = 4);
if (!a[l] && a[l + 1] && !a[l + 2] && a[l + 3] && !a[l + 4] && !a[l + 5] && a[l + 6] && a[l + 7]) return (x = 4);
}
//(((((((((())))))))))
if (r - l + 1 == 20) {
for (int i = l; i <= l + 9; i++)
if (a[l] == 1) return 0;
for (int i = l + 10; i <= r; i++)
if (a[r] == 0) return 0;
return 1024;
}
return 0;
}
LL score(LL l, LL r) {
int x;
if (check(x, l, r)) return x;
if (l + 1 == r) return 1;
while (s.size()) s.pop();
s.push(a[l]);
LL val = 0;
for (LL i = l + 1; i <= r; i++) {
if (s.size() && a[i] != s.top()) s.pop();
else s.push(a[i]);
if (s.empty()) {
if (i != r) return (score(l, i) % mod + score(i + 1, r) % mod) % mod;
else return 2 * (score(l + 1, r - 1) % mod) % mod;
}
}
return -1;
}
int main() {
//freopen("pain.in", "r", stdin);
//freopen("pain.out", "w", stdout);
cin >> n;
for (LL i = 1; i <= n; i++) a[i] = read();
cout << score(1, n) << endl;
return 0;
}
第二个点本地开 O2 在一分钟左右/kk