Cod sursa(job #112246)

Utilizator mithyPopovici Adrian mithy Data 3 decembrie 2007 22:48:36
Problema Subsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
#include <string.h>
#include <vector>
#define NMax 501

int n, m, sum, maxsubs, max = -100000;
char a[NMax], b[NMax];
int p[NMax][NMax];
int op[NMax][NMax];
std::vector< int > posx;
std::vector< int > posy;
char subs[100][NMax];

void citire();
void pd();

int main()
{
	citire();
	pd();
	return 0;
}
void pd()
{
	int i, j;

	for (i=n-1; i>=0; i--)
	for (j=m-1; j>=0; j--)
	{
		if ( a[i] == b[j] )
		{
			p[i][j] = 1 + p[i+1][j+1];
			op[i][j] = 1;
		}
		else
		{
			p[i][j] = p[i+1][j];
			op[i][j] = 2;
			if ( p[i][j] < p[i][j+1] )
			{
				p[i][j] = p[i][j+1];
				op[i][j] = 3;
			}
		}

		if ( p[i][j] > max )
		{
			max = p[i][j];
			sum = 1;
			
			continue;
		}
		if ( p[i][j] == max )
			sum++;
	}

	for (i=0; i<n; i++)
		for (j=0; j<m; j++)
			if ( p[i][j] == max && op[i][j] == 1 )
			{
				posx.push_back( i );
				posy.push_back( j );
			}

	int x, y, ok, rec = posx.size();
	maxsubs = 0;
	char aux[NMax], lg = 0;
	for (i=0; i<rec; i++)
	{
		aux[0] = NULL; lg = 0;
		x  = posx[i]; y = posy[i];

		while ( x < n && y < m )
		{
			aux[lg++] = a[x];
			if ( op[x][y] == 1 )
			{
				x++, y++;
				continue;
			}
			if ( op[x][y] == 2 )
			{
				x++;
				continue;
			}
			if ( op[x][y] == 3 )
			{
				y++;
				continue;
			}

			
		}
		
		aux[lg] = NULL;
		for (j=0, ok=1; j<maxsubs && ok ; j++)
			if ( strcmp( subs[j], aux ) == 0 )
				ok = 0;

		if ( ok )
			strcpy( subs[maxsubs++], aux );
	}


	std::ofstream fout( "subsir.out" );
	//fout << sum << '\n';

	fout << maxsubs << '\n';
}
void citire()
{
	std::ifstream f( "subsir.in" );
	f >> a >> b;
	f.close();

	n = strlen( a );
	m = strlen( b );
}