Cod sursa(job #2779443)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 3 octombrie 2021 19:25:26
Problema Pedefe Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <bits/stdc++.h>
#define MOD 666013
std::ifstream fin ("pedefe.in");
std::ofstream fout ("pedefe.out");
const int NMAX(505);
int dp[2][NMAX][NMAX], s1[NMAX], s2[NMAX], s3[NMAX], AIB[NMAX], sum[NMAX], k, i, j;   ///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 += (poz & -poz))
        AIB[poz] = modul(AIB[poz] + val);
}
inline int Query(int poz)
{
    int rez = 0;
    for(; poz >= 1; poz -= (poz & -poz))
        rez = modul(rez + AIB[poz]);
    return rez;
}
int main()
{
    int n, m, p;
    fin >> n >> m >> p;
    for(int i = 1; i <= n; ++i)
        fin >> s1[i];
    for(int i = 1; i <= m; ++i)
        fin >> s2[i];
    for(int i = 1; i <= p; ++i)
        fin >> s3[i];
    dp[0][0][0] = 1;
    int cur = 1, ok = 1;
    for(k = 0; k <= p; ++k)
    {
        memset(sum, 0, sizeof(sum));
        memset(dp[1 - cur], 0, sizeof(dp[1 - cur]));
        for(i = 1; i <= n; ++i){
            memset(AIB, 0, sizeof(AIB));
            for(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]);
    fout << rez << '\n';
    return 0;
}