Cod sursa(job #1118446)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 24 februarie 2014 11:08:48
Problema Subsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include <cstring>
#include <algorithm>

#define NMAX 507
#define Mod 666013

using namespace std;

ifstream cin("subsir.in");
ofstream cout("subsir.out");

char a[NMAX], b[NMAX];
int D[NMAX][NMAX], Ans[NMAX][NMAX];

int main(){
    cin >> a + 1;
    cin >> b + 1;
    a[0] = b[0] = 1;
    int n = strlen(a + 1);
    int m = strlen(b + 1);
    for(int i = 0; i <= max(n, m); ++i)
        Ans[i][0] = Ans[0][i] = 1;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j){
            if(a[i] == b[j]){
                D[i][j] = 1 + D[i - 1][j - 1];
                Ans[i][j] = Ans[i - 1][j - 1];
            }
            else
            if(D[i - 1][j] > D[i][j - 1]){
                D[i][j] = D[i - 1][j];
                Ans[i][j] = Ans[i - 1][j];
            }
            else
            if(D[i][j - 1] > D[i - 1][j]){
                D[i][j] = D[i][j - 1];
                Ans[i][j] = Ans[i][j - 1];
            }
            else{
                D[i][j] = D[i - 1][j];
                Ans[i][j] = Ans[i - 1][j] + Ans[i][j - 1];
                Ans[i][j] %= Mod;
                if(D[i][j] == D[i - 1][j - 1])
                    Ans[i][j] -= Ans[i - 1][j - 1];
                if(Ans[i][j] < 0)
                    Ans[i][j] += Mod;
            }
            Ans[i][j] %= Mod;
        }
    cout << Ans[n][m];
    return 0;
}