Cod sursa(job #2938027)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 11 noiembrie 2022 15:42:42
Problema Pedefe Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
/// Preset de infoarena
#include <fstream>
#include <iostream>

using namespace std;

ifstream fin("pedefe.in");
ofstream fout("pedefe.out");

const int maxN = 505, mod = 666013;
int n, m, p, ans, s1[maxN], s2[maxN], s3[maxN], aib[maxN], dp[2][maxN][maxN], sum[maxN];

void update(int poz, int val)
{
    for(int i = poz; i <= 500; i += (i & (-i)))
        aib[i] = (aib[i] + val) % mod;
}

int query(int poz)
{
    int aux = 0;
    for(int i = poz; i >= 1; i -= (i & (-i)))
        aux = (aux + aib[i]) % mod;
    return aux;
}

int main()
{
    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;
    for(int k = 0; k <= p; k++)
    {
        int ck = (k + 1) % 2, nk = k % 2;
        for(int i = 0; i < maxN; i++)
        {
            sum[i] = 0;
            for(int j = 0; j < maxN; j++)
                dp[nk][i][j] = 0;
        }
        for(int i = 1; i <= n; i++)
        {
            for(int j = 0; j < maxN; j++)
                aib[j] = 0;
            for(int j = 1; j <= m; j++)
            {
                if(s1[i] == s2[j])
                {
                    if(s1[i] == s3[k + 1])
                        dp[nk][i][j] = (dp[nk][i][j] + query (s1[i]) + (k == 0)) % mod;
                    else
                        dp[ck][i][j] = (dp[ck][i][j] + query (s1[i]) + (k == 0)) % mod;
                }
                update(s2[j], sum[j]);
                sum[j] = (sum[j] + dp[ck][i][j]) % mod;
            }
        }
    }
    int ind = (p + 1) % 2;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            ans = (ans + dp[ind][i][j]) % mod;
    fout << ans;
    return 0;
}