Pagini recente » Cod sursa (job #3274307) | Cod sursa (job #3264488) | Cod sursa (job #3231602) | Cod sursa (job #2514471) | Cod sursa (job #2397903)
#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], dp[2][MAXN + 1][MAXN + 1];
short s[3][MAXN + 1], len[3];
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;
}