# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
255239 | Kastanda | parentrises (BOI18_parentrises) | C++11 | 85 ms | 55736 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// M
#include<bits/stdc++.h>
using namespace std;
const int MXN = 1000006, N = 303, Mod = 1e9 + 7;
int Sub;
void SolveSub1()
{
int q;
char S[MXN];
fill(S, S + MXN, 0);
scanf("%d", &q);
for (; q; q --)
{
scanf("%s", S);
int n = strlen(S);
vector < int > C(n, 0), Stk, OP;
for (int i = 0; i < n; i ++)
{
if (S[i] == '(')
Stk.push_back(i);
else if (Stk.size())
C[Stk.back()] = C[i] = 1, Stk.pop_back();
else
OP.push_back(i);
}
bool Fail = 0;
vector < int > Kts, PO;
for (int i = n - 1; ~ i; i --)
{
if (Stk.size())
{
if (Stk.back() == i)
{
if (!Kts.size())
{Fail = 1; break;}
C[Kts.back()] += 2;
Kts.pop_back();
C[Stk.back()] += 2;
Stk.pop_back();
continue;
}
if (S[i] == '(')
continue;
Kts.push_back(i);
}
else
{
if (OP.size() && OP.back() == i)
{
PO.push_back(OP.back());
OP.pop_back();
continue;
}
if (S[i] == ')')
continue;
if (PO.size())
{
C[PO.back()] += 2;
PO.pop_back();
C[i] += 2;
}
}
}
if (PO.size() || OP.size() || Stk.size())
Fail = 1;
fill(S, S + n, 0);
if (Fail)
printf("impossible\n");
else
{
for (int i = 0; i < n; i ++)
printf("%c", "RBG"[C[i] - 1]);
printf("\n");
}
}
exit(0);
}
int dp[N][N][N], dp2[N][N], R[N], F[N];
inline void Add(int &a, int b)
{
a += b;
if (a >= Mod)
a -= Mod;
}
inline void SolveSub2()
{
int n = 300;
F[0] = 1;
dp2[0][0] = 1;
dp[0][0][0] = 1;
for (int i = 0; i < n; i ++)
{
for (int j = 0; j <= i; j ++)
{
// '('
Add(dp2[i + 1][j + 1], dp2[i][j]);
// ')'
if (j) Add(dp2[i + 1][j - 1], dp2[i][j]);
for (int h = 0; h <= i; h ++)
{
// '('
Add(dp[i + 1][j + 1][h + 1], dp[i][j][h]);
// ')'
if (j)
Add(dp[i + 1][j - 1][h], dp[i][j][h]);
else if (h)
{
Add(dp[i + 1][j][h - 1], dp[i][j][h]);
if (j == 0)
Add(F[i + 1], dp[i][j][h]);
}
}
}
}
for (int i = 1; i <= n; i ++)
for (int j = 0; j <= i; j ++)
for (int h = 0; j + h <= i; h ++)
R[i] = (R[i] + 1LL * F[j] * F[h] % Mod * dp2[i - j - h][0]) % Mod;
int q;
scanf("%d", &q);
for (; q; q --)
{
scanf("%d", &n);
printf("%d\n", R[n]);
}
return ;
}
int main()
{
scanf("%d", &Sub);
if (Sub == 1)
SolveSub1();
else
SolveSub2();
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |