Cod sursa(job #935409)

Utilizator manciu_ionIon Manciu manciu_ion Data 3 aprilie 2013 13:35:06
Problema Pedefe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 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(const int X){
    return X&(-X);
}

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