Cod sursa(job #2657045)

Utilizator anabatAna Batrineanu anabat Data 9 octombrie 2020 16:28:48
Problema Subsir Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>
#include <string.h>
#include <iostream>

using namespace std;

#define NMAX 500
#define MOD 666013

int dp[NMAX+1][NMAX+1],nr[NMAX+1][NMAX+1];
char a[NMAX],b[NMAX];

int main()
{
  FILE *fin,*fout;
  fin=fopen("subsir.in","r");
  fout=fopen("subsir.out","w");

  int i,j,n,m;
  fscanf(fin,"%s",a);
  fscanf(fin,"%s",b);
  n=strlen(a);
  m=strlen(b);

  for(i=0;i<=n;i++){
    nr[i][0]=1;
  }
  for(j=0;j<=m;j++){
    nr[0][j]=1;
  }
  for(i=1;i<=n;i++){
    for(j=1;j<=m;j++){
      if(a[i]==b[j]){
        dp[i][j]=1+dp[i-1][j-1];
        nr[i][j]=nr[i-1][j-1]%MOD;
      }
      else{
        dp[i][j]=std::max(dp[i-1][j],dp[i][j-1]);
        if(dp[i][j]==dp[i-1][j]){
          nr[i][j]=(nr[i][j]+nr[i-1][j])%MOD;
        }
        else if(dp[i][j]==dp[i][j-1]){
          nr[i][j]=(nr[i][j]+nr[i][j-1])%MOD;
        }
        else if(dp[i][j]==dp[i-1][j-1]){
          nr[i][j]=(nr[i][j]-nr[i-1][j-1]+MOD)%MOD;
        }
      }
    }
  }

  fprintf(fout,"%d",nr[n][m]);

  fclose(fin);
  fclose(fout);
  return 0;
}