Cod sursa(job #2182752)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 22 martie 2018 17:05:27
Problema Subsir Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>
using namespace std;

FILE *f1 = fopen("subsir.in", "r");
FILE *f2 = fopen("subsir.out", "w");

const int kMax = 505;

int main() {

	char a[kMax], b[kMax];
	int dp_len[kMax][kMax], dp_sol[kMax][kMax];
	int i, j, l1, l2;
	fscanf(f1, "%s\n", a);
	fscanf(f1, "%s", b);
	l1 = strlen(a);
	l2 = strlen(b);
	
	memcpy(a+1, a, strlen(a)+1);
	memcpy(b+1, b, strlen(b)+1);
	
	for (i = 0; i < kMax; i++)
		for (j = 0; j < kMax; j++) {
			dp_len[i][j] = 0;
			dp_sol[i][j] = 0;
		}
	//calculate lengths
	for (i = 1; i <= l1; i++)
		for (j = 1; j <= l2; j++)
			if (a[i] == b[j]) {
				dp_len[i][j] = 1 + dp_len[i-1][j-1];
			}
			else {
				dp_len[i][j] = max(dp_len[i-1][j], dp_len[i][j-1]);
			}
	
	//calculate distinct common subsequences

	//empty substring is always common
	for (i = 0; i <= l1; i++)
		dp_sol[i][0] = 1;
	for (i = 0; i <= l2; i++)
		dp_sol[0][i] = 1;

	for (i = 1; i <= l1; i++)
		for (j = 1; j <= l2; j++)
			if (a[i] == b[j]) {
				//all substrings already found + the new common character
				dp_sol[i][j] = dp_sol[i-1][j-1];
			}
			else {
				if (dp_len[i][j] == dp_len[i-1][j])
					dp_sol[i][j] += dp_sol[i-1][j];
				if (dp_len[i][j] == dp_len[i][j-1])
					dp_sol[i][j] += dp_sol[i][j-1];
				if (dp_len[i][j] == dp_len[i-1][j-1])
					dp_sol[i][j] -= dp_sol[i-1][j-1];
			}
	fprintf(f2, "%d\n", dp_sol[l1][l2]);
	fclose(f1);
	fclose(f2);
	return 0;
}