Cod sursa(job #360917)

Utilizator GulyanAlexandru Gulyan Data 2 noiembrie 2009 21:38:10
Problema Subsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

#define SMAX 500

char s1[SMAX], s2[SMAX];
int n1, n2;
uint16_t **a;
uint8_t **b;

#define UP 1
#define LEFT 2
#define UPLEFT 3

int main()
{
	//citire date
	freopen("subsir.in", "r", stdin);
	freopen("subsir.out", "w", stdout);
	
	fgets(s1, SMAX, stdin);
	fgets(s2, SMAX, stdin);
	n1 = strlen(s1);
	n2 = strlen(s2);
	if(s1[n1-1] == '\n')
		s1[--n1] = '\0';
	if(s2[n2-1] == '\n')
		s2[--n2] = '\0';
	
	int i, j;
	
	//alocare & initializare memorie
	a = (uint16_t**)malloc((n1+1) * sizeof(uint16_t*));
	b = (uint8_t**)malloc((n1+1) * sizeof(uint8_t*));
	for(i = 0; i <= n1; ++i){
		a[i] = (uint16_t*)malloc((n2+1) * sizeof(uint16_t));
		b[i] = (uint8_t*)malloc((n2+1) * sizeof(uint8_t));
		for(j = 0;j <= n2; ++j)
			b[i][j] = a[i][j] = 0;
	}
	
	for(i = 1; i <= n1; ++i)
		for(j = 1; j <= n2; j++){
			if(s1[i-1] == s2[j-1]){
				a[i][j] = a[i-1][j-1] + 1;
				b[i][j] = UPLEFT;
			}
			else if(a[i-1][j] > a[i][j-1]){
				a[i][j] = a[i-1][j];
				b[i][j] = UP;
			}
			else {
				a[i][j] = a[i][j-1];
				b[i][j] = LEFT;
			}
		}
	
	int max = a[n1][n2];
	unsigned int n = 0;
	for(i = n2; i > 0; --i)
		if(a[i][j] == max)
			n++;
			
	printf("%u", n);
	
	//eliberare memorie
	for(i = 0; i <= n1; ++i){
		free(a[i]);
		free(b[i]);
	}
	free(a);
	free(b);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}