Pagini recente » Cod sursa (job #1600976) | Cod sursa (job #705569) | Cod sursa (job #1177921) | Cod sursa (job #117763) | Cod sursa (job #2447069)
#include <fstream>
#include <cstring>
#define DIM 510
#define MOD 666013
using namespace std;
ifstream fin ("pedefe.in");
ofstream fout ("pedefe.out");
int maxi = 500;
int d[2][DIM][DIM],s[DIM],aib[DIM],a[DIM],b[DIM],c[DIM];
int n,m,p,i,j,k,t,ok;
inline int f (int x){
if (x >= MOD)
x -= MOD;
return x;
}
inline void update (int poz, int val){
for (;poz<=maxi;poz+=(poz&-poz))
aib[poz] = f(aib[poz] + val);
}
inline int query (int poz){
int sol = 0;
for (;poz;poz-=(poz&-poz))
sol = f(sol+aib[poz]);
return sol;
}
int main (){
fin>>n>>m>>p;
for (i=1;i<=n;i++)
fin>>a[i];
for (i=1;i<=m;i++)
fin>>b[i];
for (i=1;i<=p;i++)
fin>>c[i];
/// d[i][j][k] - nr de siruri crescatoare care se pot forma folosind primele i caractere din primul
/// j din al doilea si primele k sa fie subsir, a[i] = b[j]
d[0][0][0] = 1;
t = ok = 1;
for (k=0;k<=p;k++){
memset (s,0,sizeof s);
memset (d[1-t],0,sizeof d[1-t]);
for (i=1;i<=n;i++){
memset (aib,0,sizeof aib);
for (j=1;j<=m;j++){
if (a[i] == b[j]){
if (a[i] == c[k+1])
d[1-t][i][j] = f(d[1-t][i][j]+query (a[i])+ok);
else d[t][i][j] = f(d[t][i][j]+query (a[i])+ok);
}
update (b[j],s[j]);
s[j] = f(s[j]+d[t][i][j]);
}}
t = 1-t;
if (ok) ok = 0;
}
int sol = 0;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
sol = f(sol+d[1-t][i][j]);
fout<<sol;
return 0;
}