Cod sursa(job #2409244)

Utilizator NeredesinI am not real Neredesin Data 18 aprilie 2019 20:13:39
Problema Pedefe Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

ifstream in("pedefe.in");
ofstream out("pedefe.out");

const int NMAX = 503;
const int PMAX = 103;

const int MOD = 666013;

int n, m, p;
int s;

int s1[NMAX], s2[NMAX], s3[PMAX];

int dp[2][NMAX][NMAX];
int aib[NMAX][NMAX];

inline void update(int aib[], int poz, const int &val) {
	for(; poz <= NMAX; poz += (poz & (-poz))) {
		aib[poz] += val;
		if(aib[poz] >= MOD)
			aib[poz] -= MOD;
	}
}

inline int query(int aib[], int poz) {
	int r = 0;
	for(; poz; poz -= (poz & (-poz))) {
		r += aib[poz];
		if(r >= MOD)
			r -= MOD;
	}
	return r;
}

int main() {
	int i, j, k;

	in >> n >> m >> p;

	for(i = 1; i<=n; ++i)
		in >> s1[i];
	for(i = 1; i<=m; ++i)
		in >> s2[i];
	for(i = 1; i<=p; ++i)
		in >> s3[i];

	s1[0] = s2[0] = 1;
	dp[0][0][0] = 1;

	for(k = 0; k <= p; ++k) {
		int pp = k % 2;

		memset(aib, 0, sizeof(aib));

		for(i = 0; i <= n; ++i)
			for(j = 0; j <= m; ++j) {
				dp[pp ^ 1][i][j] = 0;
			}

		for(i = 0; i<=n; ++i) {
			s = 0;

			for(j = 0; j <= m; ++j) {

				s += dp[pp][i][j];
				if(s >= MOD)
					s -= MOD;

				if(s)
					update(aib[j], s1[i], s);

				if(i < n && j < m && s1[i + 1] == s2[j + 1]) {
					int poz = pp;
					if(s1[i + 1] == s3[k + 1])
						poz ^= 1;

					dp[poz][i + 1][j + 1] += query(aib[j], s1[i + 1]);
					if(dp[poz][i + 1][j + 1] >= MOD)
						dp[poz][i + 1][j + 1] -= MOD;
				}
			}
		}
	}

	out << query(aib[m], NMAX);

	in.close();
	out.close();

	return 0;
}