Cod sursa(job #1116896)

Utilizator horatiu13Horatiu horatiu13 Data 22 februarie 2014 21:31:52
Problema Subsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
/*
http://www.infoarena.ro/problema/subsir
*/
#include <cstdio>
#include <string.h>
#define Nmax 505
using namespace std;

FILE *fi = fopen("subsir.in", "r");
FILE *fo = fopen("subsir.out", "w");

char v[Nmax];
char w[Nmax];
int a[Nmax][Nmax];
int n;
int m;
int ct;
int mx = 1<<31;

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

void dinamica()
{
	for (int i = 1; i<=m; i++)
	{
		for (int j = 1; j<=n; j++)
		{
			if (v[i] == w[j])
				a[i][j] = maxim(a[i-1][j-1] + 1, a[i-1][j]);
			else
				a[i][j] = maxim(a[i-1][j], a[i][j-1]);
			
			if (a[i][j] > mx)
			{
				mx = a[i][j];
				ct = 1;
			}
			else if (a[i][j] == mx && v[i] == w[j] && a[i-1][j-1] + 1 > a[i-1][j]) ct++;
		}
	}
}

int main()
{
	fscanf(fi, "%s", w+1);
	fscanf(fi, "%s", v+1);
	
	m = strlen(v+1);
	n = strlen(w+1);
	
	dinamica();
	
	/*
	for (int i = 1; i<=m; i++)
	{
		for (int j = 1; j<=n; j++)
			printf("%d ", a[i][j]);
		printf("\n");
	}
	//*/
	fprintf(fo, "%d", ct);
	return 0;
}