Cod sursa(job #795944)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 9 octombrie 2012 21:39:44
Problema Pedefe Scor 75
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.6 kb
#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(int X){
    return X&(-X);
}

inline void Update(int Tree[], int Pos, 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[1][0][0] = S[0][0] = S[1][0] = 1;
    for (int p = 0; p <= P; ++p) {
        memcpy(DP[0], DP[1], sizeof(DP[1]));
        memset(DP[1], 0, sizeof(DP[1]));
        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[0][i][j]);
                Update(BIT[j], S[0][i], SumC);
                if (i < N && j < M && S[0][i+1] == S[1][j+1]) {
                    int l = (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;
}