Cod sursa(job #2397901)

Utilizator cella.florescuCella Florescu cella.florescu Data 4 aprilie 2019 21:10:41
Problema Pedefe Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXV = 500;
const int MAXN = 500;
const int MOD = 666013;

int aib[MAXN + 1][MAXV + 1], s[3][MAXN + 1], len[3], dp[2][MAXN + 1][MAXN + 1];

inline void add(int& val, int num) {
  val += num;
  if (val >= MOD)
    val -= MOD;
}

inline int zero(int x) {
  return x & -x;
}

inline void update(int wh[], int pos, int val) {
  for (pos = pos; pos <= MAXV; pos += zero(pos))
    add(wh[pos], val);
}

inline int query(int wh[], int pos) {
  int ans = 0;
  for (pos = pos; pos > 0; pos -= zero(pos))
    add(ans, wh[pos]);
  return ans;
}

int main()
{
    ifstream fin("pedefe.in");
    fin >> len[0] >> len[1] >> len[2];
    for (int ind = 0; ind < 3; ++ind)
      for (int i = 1; i <= len[ind]; ++i)
        fin >> s[ind][i];
    fin.close();
    dp[0][0][0] = s[0][0] = s[1][0] = 1;
    for (int k = 0, ind = 0; k <= len[2]; ++k, ind = 1 - ind) {
      memset(aib, 0, sizeof aib);
      memset(dp[1 - ind], 0, sizeof dp[1 - ind]);
      for (int i = 0; i <= len[0]; ++i) {
        int upd = 0;
        for (int j = 0; j <= len[1]; ++j) {
          add(upd, dp[ind][i][j]);
          update(aib[j], s[0][i], upd);
          if (i < len[0] && j < len[1] && s[0][i + 1] == s[1][j + 1]) {
            int pos = (ind ^ (s[2][k + 1] == s[0][i + 1]));
            add(dp[pos][i + 1][j + 1], query(aib[j], s[0][i + 1]));
          }
        }
      }
    }
    ofstream fout("pedefe.out");
    fout << query(aib[len[1]], MAXV) << '\n';
    fout.close();
    return 0;
}