Pagini recente » Cod sursa (job #1464577) | Cod sursa (job #1071447) | Cod sursa (job #1126399) | Cod sursa (job #2481429) | Cod sursa (job #935409)
Cod sursa(job #935409)
#include <fstream>
#include <cstring>
using namespace std;
const int MaxN = 505;
const int Modulo = 666013;
int N, M, P, DP[2][MaxN][MaxN], BIT[MaxN][MaxN];
int S[3][MaxN];
inline void Mod(int &X) {
if (X >= Modulo)
X -= Modulo;
}
inline int LSB(const int X){
return X&(-X);
}
inline void Update(int Tree[], int Pos, const int Val) {
for (; Pos < MaxN; Pos += LSB(Pos))
Mod(Tree[Pos] += Val);
}
inline int Query(int Tree[], int Pos) {
int Val = 0;
for (; Pos > 0; Pos -= LSB(Pos))
Mod(Val += Tree[Pos]);
return Val;
}
void Solve() {
DP[0][0][0] = S[0][0] = S[1][0] = 1;
for (int p = 0, L = 1; p <= P; ++p, L ^= 1) {
memset(DP[L], 0, sizeof(DP[L]));
memset(BIT, 0, sizeof(BIT));
for (int i = 0, SumC = 0; i <= N; ++i, SumC = 0) {
for (int j = 0; j <= M; ++j) {
Mod(SumC += DP[L^1][i][j]);
if (SumC > 0)
Update(BIT[j], S[0][i], SumC);
if (i < N && j < M && S[0][i+1] == S[1][j+1]) {
int l = L^1^(S[0][i+1] == S[2][p+1]);
Mod(DP[l][i+1][j+1] += Query(BIT[j], S[0][i+1]));
}
}
}
}
}
void Read() {
ifstream fin("pedefe.in");
fin >> N >> M >> P;
for (int i = 1; i <= N; ++i)
fin >> S[0][i];
for (int i = 1; i <= M; ++i)
fin >> S[1][i];
for (int i = 1; i <= P; ++i)
fin >> S[2][i];
fin.close();
}
void Print() {
ofstream fout("pedefe.out");
fout << Query(BIT[M], MaxN-1);
fout.close();
}
int main() {
Read();
Solve();
Print();
return 0;
}