#include <cstdio> using namespace std; struct dps { int a[2]; }; const int key = 10007; const dps empty = {{1, 1}}; int l, oslev = 1, fslev = 1; dps fs[100005]; char os[100005], s[100003]; inline void calc(char op, dps &a, dps &b) { if (op == '+') { a.a[1] = (a.a[1] * (b.a[0] + b.a[1]) + a.a[0] * b.a[1]) % key; a.a[0] = a.a[0] * b.a[0] % key; } else { a.a[0] = (a.a[0] * (b.a[0] + b.a[1]) + a.a[1] * b.a[0]) % key; a.a[1] = a.a[1] * b.a[1] % key; } } int main() { //freopen("exp.in" ,"r", stdin); //freopen("exp.out", "w", stdout); scanf("%d%s", &l, &s); os[1] = '('; fs[1] = empty; s[l] = ')'; for (int i=0; i<=l; i++) if (s[i] == '(') os[++oslev] = '('; else if (s[i] == ')') { for (; os[oslev] != '('; --oslev, --fslev) calc(os[oslev], fs[fslev - 1], fs[fslev]); --oslev; } else { for (; (os[oslev] <= s[i]) && (os[oslev] != '('); --oslev, --fslev) calc(os[oslev], fs[fslev - 1], fs[fslev]); os[++oslev] = s[i]; fs[++fslev] = empty; } printf("%d\n", fs[1].a[0]); return 0; } /************************************************************** Problem: 2303 User: admin Language: C++ Result: Accepted Time:48 ms Memory:2120 kb ****************************************************************/