Pagini recente » Cod sursa (job #711116) | Cod sursa (job #1801781) | Cod sursa (job #2624138) | Cod sursa (job #2409244)
#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;
}