Cod sursa(job #2776834)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 21 septembrie 2021 12:35:22
Problema Culori Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <iostream>
#include <fstream>

#define MOD 9901

int n;
int a[1000];
int prev[1000];
int c[1024][1024];

void getprev(int map) {
  int iprev[500] = { 0 };
  for (int i = 1; i <= map; ++i) {
    prev[i] = iprev[a[i]];
    iprev[a[i]] = i;
  }
}

int main()
{
  std::ifstream in("culori.in");
  std::ofstream out("culori.out");

  in >> n;
  int map = 2 * n - 1;
  for (int i = 1; i <= map; ++i) in >> a[i];
  getprev(map);

  for (int len = 1; len <= map; len += 2) {
    for (int first = 1; first + len - 1 <= map; ++first) {
      int last = first + len - 1;
      if (len == 1) { c[first][last] = 1; continue; }
      if (a[first] != a[last]) { c[first][last] = 0; continue; }
      c[first][last] = c[first + 1][last - 1]; // No intermediates.
      for (int second = prev[last]; second > first; second = prev[second]) {
        c[first][last] += c[first][second] * c[second + 1][last - 1];
        c[first][last] %= MOD;
      }
      //std::cerr << "c[" << first << "][" << last << "] = " << c[first][last]
      //    << std::endl;
    }
  }

  out << c[1][map] << std::endl;

  return 0;
}