Cod sursa(job #918207)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 18 martie 2013 18:13:55
Problema Pedefe Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 2.05 kb
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
 
const int N = 503;
const int P = 103;
const int MOD = 666013;
 
int n, m, p, s1[N], s2[N], s3[P], d[2][N][N], aib[N][N], s;
 
inline void update(int aib[], int poz, const int &val) {
    for(; poz <= N; poz += (poz & (-poz))) {
        aib[poz] += val;
        if(aib[poz] >= MOD)
            aib[poz] -= MOD;
    }
}
 
inline int query(int aib[], int poz) {
    int r = 0;
    for(; poz; poz -= (poz & (-poz))) {
        r += aib[poz];
        if(r >= MOD)
            r -= MOD;
    }
    return r;
}
 
int main() {
    int i, j, k;
     
    freopen("pedefe.in", "r", stdin);
    freopen("pedefe.out", "w", stdout);
     
    cin >> n >> m >> p;
     
    for(i = 1; i<=n; ++i)
        cin >> s1[i];
    for(i = 1; i<=m; ++i)
        cin >> s2[i];
    for(i = 1; i<=p; ++i)
        cin >> s3[i];
     
    s1[0] = s2[0] = 1;
    d[0][0][0] = 1;
     
    for(k = 0; k <= p; ++k) {
        int pp = k % 2;
         
        memset(aib, 0, sizeof(aib));
         
        for(i = 0; i <= n; ++i)
            for(j = 0; j <= m; ++j) {
                //d[0][i][j] = d[1][i][j];
                d[pp ^ 1][i][j] = 0;
            }
         
        for(i = 0; i<=n; ++i) {
            s = 0;
             
            for(j = 0; j <= m; ++j) {
                 
                s += d[pp][i][j];
                if(s >= MOD)
                    s -= MOD;
                 
                if(s)
                    update(aib[j], s1[i], s);
                 
                if(i < n && j < m && s1[i + 1] == s2[j + 1]) {
                    int poz = pp;
                    if(s1[i + 1] == s3[k + 1])
                        poz ^= 1;
                     
                    d[poz][i + 1][j + 1] += query(aib[j], s1[i + 1]);
                    if(d[poz][i + 1][j + 1] >= MOD)
                        d[poz][i + 1][j + 1] -= MOD;
                }
            }
        }
    }
     
    cout << query(aib[m], N);
     
    return 0;
}