Pagini recente » Cod sursa (job #2238918) | Cod sursa (job #2000805) | Cod sursa (job #638110) | Cod sursa (job #2162113) | Cod sursa (job #360917)
Cod sursa(job #360917)
#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;
}