Pagini recente » Cod sursa (job #1661766) | Cod sursa (job #846130)
Cod sursa(job #846130)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 510;
const int P = 110;
const int MOD = 666013;
int n, m, p, s1[N], s2[N], s3[P], d[2][N][N], aib[N][N], s;
void update(int aib[], int poz, int val) {
for(; poz <= N; poz += (poz & (-poz))) {
aib[poz] += val;
if(aib[poz] >= MOD)
aib[poz] -= MOD;
}
}
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;
freopen("pedefe.in", "r", stdin);
freopen("pedefe.out", "w", stdout);
cin >> n >> m >> p;
for(i = 1; i<=n; ++i)
cin >> s1[i];
for(i = 1; i<=m; ++i)
cin >> s2[i];
for(i = 1; i<=p; ++i)
cin >> s3[i];
s1[0] = s2[0] = 1;
d[1][0][0] = 1;
for(k = 0; k <= p; ++k) {
memset(aib, 0, sizeof(aib));
for(i = 0; i <= n; ++i)
for(j = 0; j <= m; ++j) {
d[0][i][j] = d[1][i][j];
d[1][i][j] = 0;
}
for(i = 0; i<=n; ++i) {
s = 0;
for(j = 0; j <= m; ++j) {
s += d[0][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 = 0;
if(s1[i + 1] == s3[k + 1])
poz = 1;
d[poz][i + 1][j + 1] += query(aib[j], s1[i + 1]);
if(d[poz][i + 1][j + 1] >= MOD)
d[poz][i + 1][j + 1] -= MOD;
}
}
}
}
cout << query(aib[m], N);
return 0;
}