Cod sursa(job #2779436)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 3 octombrie 2021 19:15:08
Problema Pedefe Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <bits/stdc++.h>

#define nozeros(x) (x & -x)
using namespace std;

const int MOD(666013), NMAX(505);

int dp[2][NMAX][NMAX], s1[NMAX], s2[NMAX], s3[NMAX], AIB[NMAX], sum[NMAX];   ///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 += nozeros(poz))
        AIB[poz] = modul(AIB[poz] + val);
}
inline int Query(int poz)
{
    int rez = 0;
    for(; poz >= 1; poz -= nozeros(poz))
        rez = modul(rez + AIB[poz]);
    return rez;
}
int main()
{
    freopen("pedefe.in", "r", stdin);
    freopen("pedefe.out", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int n, m, p;
    cin >> n >> m >> p;
    for(int i = 1; i <= n; ++i)
        cin >> s1[i];
    for(int i = 1; i <= m; ++i)
        cin >> s2[i];
    for(int i = 1; i <= p; ++i)
        cin >> s3[i];
    dp[0][0][0] = 1;
    int cur = 1, ok = 1;
    for(int k = 0; k <= p; ++k)
    {
        memset(sum, 0, sizeof(sum));
        memset(dp[1 - cur], 0, sizeof(dp[1 - cur]));
        for(int i = 1; i <= n; ++i){
            memset(AIB, 0, sizeof(AIB));
            for(int 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]);
    cout << rez << '\n';
    return 0;
}