Pagini recente » Cod sursa (job #740856) | Statistici IOANA RARES-ANDREI (Rares181818) | Cod sursa (job #1278064) | Monitorul de evaluare | Cod sursa (job #1900216)
#include <bits/stdc++.h>
using namespace std;
constexpr int maxn = 600, mod = 9901;
int n, euler[maxn] = {}, d[maxn][maxn] = {}, next_eq_same_parity[maxn] = {};
void build_next_eq_same_parity(){
static int next_eq_cur[maxn][2] = {};
memset(next_eq_cur, 0x3f, sizeof(next_eq_cur));
for(int i = 2*n-2; i >= 0; --i){
next_eq_same_parity[i] = next_eq_cur[euler[i]][i%2];
next_eq_cur[euler[i]][i%2] = i; } }
void do_interval(const int st, const int dr){
int rez = d[st+1][dr-1];
for(int mij = next_eq_same_parity[st]; mij <= dr-2; mij = next_eq_same_parity[mij]){
if(euler[st+1] == euler[mij-1])
rez = (rez + d[st+1][mij-1] * d[mij][dr])%mod; }
d[st][dr] = rez; }
void build_d(){
for(int i = 0; i < 2*n-1; ++i) d[i][i] = 1;
for(int i = 2*n-1; i >= 0; --i)
for(int j = next_eq_same_parity[i]; j < 2*n-1; j = next_eq_same_parity[j])
do_interval(i, j); }
ifstream f("culori.in");
ofstream g("culori.out");
int main(){
f >> n;
copy_n(istream_iterator<int>(f), 2*n-1, euler);
build_next_eq_same_parity();
build_d();
g << d[0][2*n-2] << endl;
return 0; }