Cod sursa(job #480367)

Utilizator freak93Adrian Budau freak93 Data 27 august 2010 16:06:11
Problema Pedefe Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include<fstream>

using namespace std;

const char iname[]="pedefe.in";
const char oname[]="pedefe.out";
const int maxn=505;
const int mod=666013;

ifstream f(iname);
ofstream g(oname);

int n,m,p,a[maxn],b[maxn],c[maxn],i,j,k,aib[maxn][maxn],s,dp[2][maxn][maxn];

int query(int *aib,int x)
{
    int s=0;
    for(;x;x-=x&-x)
    {
        s+=aib[x];
        if(s>=mod)
            s-=mod;
    }
    return s;
}

void update(int *aib,int x,int v)
{
    for(;x<maxn;x+=x&-x)
    {
        aib[x]+=v;
        if(aib[x]>=mod)
            aib[x]-=mod;
    }
}

int main()
{
    f>>n>>m>>p;
    for(i=1;i<=n;++i)
        f>>a[i];
    for(j=1;j<=m;++j)
        f>>b[j];
    for(k=1;k<=p;++k)
        f>>c[k];
    dp[0][0][0]=1;
    a[0]=b[0]=1;
    for(k=0;k<=p;++k)
    {
        memset(aib,0,sizeof(aib));
        memset(dp[k+1&1],0,sizeof(dp[k&1]));
        for(i=0;i<=n;++i)
        {
            s=0;
            for(j=0;j<=m;++j)
            {
                s+=dp[k&1][i][j];
                if(s>=mod)
                    s-=mod;
                update(aib[j],a[i],s);
                if(i<n&&j<m&&a[i+1]==b[j+1])
                    if(a[i+1]==c[k+1])
                    {
                        dp[k+1&1][i+1][j+1]+=query(aib[j],a[i+1]);
                        if(dp[k+1&1][i+1][j+1]>=mod)
                            dp[k+1&1][i+1][j+1]-=mod;
                    }
                    else
                    {
                        dp[k&1][i+1][j+1]+=query(aib[j],a[i+1]);
                        if(dp[k&1][i+1][j+1]>=mod)
                            dp[k&1][i+1][j+1]-=mod;
                    }
            }
        }
    }
    g<<query(aib[m],maxn-1)<<"\n";
}