Cod sursa(job #1033247)

Utilizator AnonymouslegionAnonymous Anonymouslegion Data 16 noiembrie 2013 17:07:07
Problema Subsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <cstdio>
#include <cstring>

#include <fstream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>

#define f first
#define s second
#define mp make_pair

using namespace std;

const int kmod = 666013;

pair<int, int> dp[505][505];

int main(){
  ifstream in("subsir.in");
  ofstream out("subsir.out");

  string a, b;
  in >> a >> b;

  for(int i = 0; i <= 500; ++i)
    dp[i][0] = dp[0][i] = mp(0, 1);

  for(int i = 1; i <= a.size(); ++i)
    for(int j = 1; j <= b.size(); ++j)
      if(a[i - 1] == b[j - 1]){
        dp[i][j].f = dp[i - 1][j - 1].f + 1;
        dp[i][j].s = dp[i - 1][j - 1].s;
      }
      else if(dp[i - 1][j].f == dp[i][j - 1].f){
        dp[i][j].f = dp[i - 1][j].f;
        dp[i][j].s = (dp[i - 1][j].s + dp[i][j - 1].s) % kmod;
        if(dp[i - 1][j].f == dp[i - 1][j - 1].f)
          dp[i][j].s = (dp[i][j].s - dp[i - 1][j - 1].s + kmod) % kmod;
      }
      else if(dp[i - 1][j].f > dp[i][j - 1].f){
        dp[i][j].f = dp[i - 1][j].f;
        dp[i][j].s = dp[i - 1][j].s;
      }
      else{
        dp[i][j].f = dp[i][j - 1].f;
        dp[i][j].s = dp[i][j - 1].s;
      }
  out << dp[a.size()][b.size()].s;

  return 0;
}