Pagini recente » Cod sursa (job #2205986) | Cod sursa (job #497188) | simlotvrancea2010baraj1 | Cod sursa (job #3259041) | Cod sursa (job #2779440)
#include <bits/stdc++.h>
#define MOD 666013
using namespace std;
ifstream fin ("pedefe.in");
ofstream fout ("pedefe.out");
const NMAX(505);
int dp[2][NMAX][NMAX], s1[NMAX], s2[NMAX], s3[NMAX], AIB[NMAX], sum[NMAX]; ///dp[k][i][j] (S3, S1, S2) = nr de subsiruri comune crescatoare cu elemente din 1...i din S1, 1...j din S2, contine primele k elemente din S3 si se termina cu valoare S1[i]
inline int modul(int val){
if(val >= MOD)
val -= MOD;
return val;
}
inline void Add(int poz, int val){
for(; poz <= 500; poz += (poz & -poz))
AIB[poz] = modul(AIB[poz] + val);
}
inline int Query(int poz)
{
int rez = 0;
for(; poz >= 1; poz -= (poz & -poz))
rez = modul(rez + AIB[poz]);
return rez;
}
int main()
{
int n, m, p;
fin >> n >> m >> p;
for(int i = 1; i <= n; ++i)
fin >> s1[i];
for(int i = 1; i <= m; ++i)
fin >> s2[i];
for(int i = 1; i <= p; ++i)
fin >> s3[i];
dp[0][0][0] = 1;
int cur = 1, ok = 1;
for(int k = 0; k <= p; ++k)
{
memset(sum, 0, sizeof(sum));
memset(dp[1 - cur], 0, sizeof(dp[1 - cur]));
for(int i = 1; i <= n; ++i){
memset(AIB, 0, sizeof(AIB));
for(int j = 1; j <= m; ++j){
if(s1[i] == s2[j])
{
if(s1[i] == s3[k + 1])
dp[1 - cur][i][j] = modul(dp[1 - cur][i][j] + Query(s1[i]) + ok);
else dp[cur][i][j] = modul(dp[cur][i][j] + Query(s1[i]) + ok);
}
Add(s2[j], sum[j]);
sum[j] = modul(sum[j] + dp[cur][i][j]);
}
}
ok = 0;
cur = 1 - cur;
}
int rez = 0;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
rez = modul(rez + dp[1 - cur][i][j]);
fout << rez << '\n';
return 0;
}