Pagini recente » Cod sursa (job #1078295) | Cod sursa (job #882722) | Cod sursa (job #429337) | Cod sursa (job #1851979) | Cod sursa (job #2779436)
#include <bits/stdc++.h>
#define nozeros(x) (x & -x)
using namespace std;
const int MOD(666013), 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 += nozeros(poz))
AIB[poz] = modul(AIB[poz] + val);
}
inline int Query(int poz)
{
int rez = 0;
for(; poz >= 1; poz -= nozeros(poz))
rez = modul(rez + AIB[poz]);
return rez;
}
int main()
{
freopen("pedefe.in", "r", stdin);
freopen("pedefe.out", "w", stdout);
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int n, m, p;
cin >> n >> m >> p;
for(int i = 1; i <= n; ++i)
cin >> s1[i];
for(int i = 1; i <= m; ++i)
cin >> s2[i];
for(int i = 1; i <= p; ++i)
cin >> 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]);
cout << rez << '\n';
return 0;
}