Cod sursa(job #2581921)

Utilizator andreea.nica1602Andreea Nica andreea.nica1602 Data 16 martie 2020 00:33:20
Problema Subsir Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb
/*
https://www.infoarena.ro/problema/subsir
*/

#include <bits/stdc++.h>
#include <fstream>
using namespace std;

int max(int a, int b) {
	return a > b ? a : b;
}

int main() {
	ifstream fin("subsir.in");
	ofstream fou("subsir.out");
	char first[503];
	char second[503];
	unsigned int dp[503][503];
	unsigned int dp2[503][503];

	fin >> first >> second;
	int n = strlen(first);
	int m = strlen(second);
	int i, j;

	for (i = 0; i <= m; i++) {
		dp[0][i] = 0;
		dp2[0][i] = 1;
	}

	for (i = 0; i <= n; i++) {
		dp[i][0] = 0;
		dp2[i][0] = 1;
	}

	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			if (second[i] == first[j]) {
				dp[i + 1][j + 1] = 1 + dp[i][j];

				dp2[i + 1][j + 1] = dp2[i][j];
			}
			else{
				dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j]);
				dp2[i+ 1][j + 1] = 0;
				if(dp[i + 1][j] == dp[i + 1][j + 1]){
					dp2[i + 1][j + 1] = dp2[i + 1][j];
				}
				if(dp[i][j + 1] == dp[i + 1][j + 1]){
					dp2[i + 1][j + 1] += dp2[i][j + 1];
				}

				if(dp[i][j] == dp[i + 1][j + 1]){
					dp2[i + 1][j + 1] -= dp2[i][j];
				}
			}
		}
	}

	fou << dp2[m][n];


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