Cod sursa(job #1900216)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 3 martie 2017 11:04:44
Problema Culori Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#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; }