Language: C++

 
using namespace std;
 
#define sim template < class c
#define ris return * this
#define dor > debug & operator <<
#define eni(x) sim > typename \
  enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef LOCAL
~debug() { cerr << endl; }
eni(!=) cerr << boolalpha << i; ris; }
eni(==) ris << range(begin(i), end(i)); }
sim, class b dor(pair < b, c > d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
    *this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
sim dor(const c&) { ris; }
#endif
};
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
 
using ll = long long;
using ld = long double;
 
constexpr int nax = 405;
constexpr int infty = 1000 * 1000 * 1000 + 5;
constexpr int mod = 1000 * 1000 * 1000 + 7;
 
inline ll Dodaj(ll a, ll b) {
  a += b;
  if (a >= mod) a -= mod;
  return a;
}
 
inline ll Mnoz(ll a, ll b) {
  return (a * b) % mod;
}
 
int n;
int a[nax], b[nax];
ll sil[nax];
bitset<nax> zbiora[nax], zbiorb[nax];
 
ll Dp(int pa, int pb, int ps);
ll Dp_(int pa, int pb, int ps) {
  auto Or = zbiora[pa - 1] | zbiorb[pb - 1];
  const int or_size = Or.count();
  const int ht = or_size + ps;
  assert(ht % 3 == 0);
  const int y = n - (or_size + ps);
  if (ht == n) {
    assert(y == 0);
    return sil[ps];
  }
  assert(0 <= y and y <= n);
  const int c = a[pa];
  const int d = b[pb];
  if (zbiorb[pb - 1][c]) return Dp(pa + 1, pb, ps);
  if (zbiora[pa - 1][d]) return Dp(pa, pb + 1, ps);
  const ll wybor_1 = y - 1;
  const ll wybor_2 = Mnoz(y - 1, y - 2);
  debug() << imie(pa) imie(pb) imie(ps) imie(y) imie(ht) imie(or_size) imie(c) imie(d) imie(wybor_1) imie(wybor_2);
  ll wynik = 0;
  if (c != d) {
    wynik = Mnoz(Dp(pa + 1, pb + 1, ps + 1), wybor_2);
  }
  if (ps > 0) {
    if (c == d) {
      wynik = Dodaj(wynik, Mnoz(Dp(pa + 1, pb + 1, ps - 1), ps));
    } else {
      wynik = Dodaj(wynik, Mnoz(Dp(pa + 1, pb, ps - 1), ps));
      wynik = Dodaj(wynik, Mnoz(Dp(pa, pb + 1, ps - 1), ps));
    }
  }
  return wynik;
}
 
int Encode(int pa, int pb, int ps) {
  return pa | (pb << 9) | (ps << 18);
}
 
ll Dp(int pa, int pb, int ps) {
  static map<int, ll> m;
  const int e = Encode(pa, pb, ps);
  auto it = m.find(e);
  if (it == m.end()) {
    const ll res = Dp_(pa, pb, ps);
    debug() << "Dp(" imie(pa) imie(pb) imie(ps) ") = " << res;
    return m[e] = res;
  }
  return it->second;
}
 
int main() {
  sil[0] = 1;
  for (int i = 1; i < nax; i++) {
    sil[i] = Mnoz(sil[i - 1], i);
  }
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    zbiora[i] = zbiora[i - 1];
    zbiora[i][a[i]] = 1;
  }
  for (int i = 1; i <= n; i++) {
    cin >> b[i];
    zbiorb[i] = zbiorb[i - 1];
    zbiorb[i][b[i]] = 1;
  }
  cout << Dp(1, 1, 0) << endl;
  return 0;
}


Compiler output:
a.cc:11:34: error: 'cerr' was not declared in this scope
   11 | sim > auto dud(c* x) -> decltype(cerr << *x, 0);
      |                                  ^~~~
a.cc:1:1: note: 'std::cerr' is defined in header '<iostream>'; this is probably fixable by adding '#include <iostream>'
  +++ |+#include <iostream>
    1 | 
a.cc:11:34: error: 'cerr' was not declared in this scope
   11 | sim > auto dud(c* x) -> decltype(cerr << *x, 0);
      |                                  ^~~~
a.cc:11:34: note: 'std::cerr' is defined in header '<iostream>'; this is probably fixable by adding '#include <iostream>'
a.cc:53:1: error: 'bitset' does not name a type
   53 | bitset<nax> zbiora[nax], zbiorb[nax];
      | ^~~~~~
a.cc: In function 'll Dp_(int, int, int)':
a.cc:57:13: error: 'zbiora' was not declared in this scope
   57 |   auto Or = zbiora[pa - 1] | zbiorb[pb - 1];
      |             ^~~~~~
a.cc:57:30: error: 'zbiorb' was not declared in this scope
   57 |   auto Or = zbiora[pa - 1] | zbiorb[pb - 1];
      |                              ^~~~~~
a.cc:60:3: error: 'assert' was not declared in this scope
   60 |   assert(ht % 3 == 0);
      |   ^~~~~~
a.cc:1:1: note: 'assert' is defined in header '<cassert>'; this is probably fixable by adding '#include <cassert>'
  +++ |+#include <cassert>
    1 | 
a.cc: In function 'll Dp(int, int, int)':
a.cc:94:10: error: 'map' does not name a type
   94 |   static map<int, ll> m;
      |          ^~~
a.cc:96:13: error: 'm' was not declared in this scope
   96 |   auto it = m.find(e);
      |             ^
a.cc: In function 'int main()':
a.cc:110:3: error: 'ios_base' has not been declared
  110 |   ios_base::sync_with_stdio(0);
      |   ^~~~~~~~
a.cc:111:3: error: 'cin' was not declared in this scope
  111 |   cin.tie(0);
      |   ^~~
a.cc:111:3: note: 'std::cin' is defined in header '<iostream>'; this is probably fixable by adding '#include <iostream>'
a.cc:115:5: error: 'zbiora' was not declared in this scope
  115 |     zbiora[i] = zbiora[i - 1];
      |     ^~~~~~
a.cc:120:5: error: 'zbiorb' was not declared in this scope
  120 |     zbiorb[i] = zbiorb[i - 1];
      |     ^~~~~~
a.cc:123:3: error: 'cout' was not declared in this scope
  123 |   cout << Dp(1, 1, 0) << endl;
      |   ^~~~
a.cc:123:3: note: 'std::cout' is defined in header '<iostream>'; this is probably fixable by adding '#include <iostream>'
a.cc:123:26: error: 'endl' was not declared in this scope
  123 |   cout << Dp(1, 1, 0) << endl;
      |                          ^~~~
a.cc:1:1: note: 'std::endl' is defined in header '<ostream>'; this is probably fixable by adding '#include <ostream>'
  +++ |+#include <ostream>
    1 |