Cod sursa(job #1072922)

Utilizator crisbodnarCristian Bodnar crisbodnar Data 5 ianuarie 2014 12:56:42
Problema Subsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;

const int Dmax = 505;
const int MOD = 666013;

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

int N, M, DP[Dmax][Dmax], NR[Dmax][Dmax];
char A[Dmax], B[Dmax];

void Initialize()
{
    for(int i = 0; i <= N; i++) NR[i][0] = 1;
    for(int j = 0; j <= M; j++) NR[0][j] = 1;
}

int main()
{
    fin >> (A + 1) >> (B + 1);
    N = strlen(A + 1), M = strlen(B + 1);
    Initialize();

    for(int i=1; i <= N; i++)
        for(int j=1; j <= M; j++)
        {
            if(A[i] == B[j])
            {
                DP[i][j] = DP[i-1][j-1] + 1;
                NR[i][j] = NR[i-1][j-1];
            }
            else
                if(DP[i-1][j] == DP[i][j-1])
                {
                    DP[i][j] = DP[i-1][j];
                    NR[i][j] = (NR[i-1][j] + NR[i][j-1]) % MOD;
                    if(DP[i-1][j] == DP[i-1][j-1]) NR[i][j] = (NR[i][j] - NR[i-1][j-1] + MOD) % MOD;
                }
                else
                    if(DP[i-1][j] > DP[i][j-1])
                    {
                        DP[i][j] = DP[i-1][j];
                        NR[i][j] = NR[i-1][j];
                    }
                    else
                    {
                        DP[i][j] = DP[i][j-1];
                        NR[i][j] = NR[i][j-1];
                    }
        }

    fout<<NR[N][M];

    fin.close();
    fout.close();
    return 0;
}