Pagini recente » Cod sursa (job #3193798) | Cod sursa (job #1753391) | Cod sursa (job #1551287) | Cod sursa (job #2406874) | Cod sursa (job #2217239)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#define MaxN (1000 + 4)
#define max(a, b) (a > b ? a : b)
char *
getNewString(FILE *source)
{
char *Result = (char *)malloc(MaxN * sizeof(char));
assert(fgets(Result, MaxN, source));
return(Result);
}
int
getLengthOfMaxCommonSubstring(char *firstString, int firstStringLength,
char *secondString, int secondStringLength)
{
int *pdArray = (int *)malloc(firstStringLength * secondStringLength * sizeof(int));
pdArray[0] = (firstString[0] == secondString[0]);
for(int i = 1; i < firstStringLength; ++i)
{
pdArray[i*secondStringLength] = (firstString[i] == secondString[0] ||
pdArray[(i-1)*secondStringLength]);
}
for(int i = 1; i < secondStringLength; ++i)
{
pdArray[i] = (firstString[0] == secondString[i] ||
pdArray[i-1]);
}
for(int i = 1; i < firstStringLength; ++i)
{
for(int j = 1; j < secondStringLength; ++j)
{
pdArray[i*secondStringLength + j] =
firstString[i] == secondString[j] ?
pdArray[(i-1)*secondStringLength + (j-1)] + 1 :
max(pdArray[i*secondStringLength + (j-1)],
pdArray[(i-1)*secondStringLength + j]);
}
}
return(pdArray[firstStringLength*secondStringLength - 1]);
}
int main(int argc, char **argv)
{
FILE *inputFile = fopen("scmax.in", "r");
FILE *outputFile = fopen("scmax.out", "w");
char *firstString = getNewString(inputFile);
char *secondString = getNewString(inputFile);
int firstStringLength = strlen(firstString) -1;
int secondStringLength = strlen(secondString) -1;
fprintf(outputFile, "%d\n",
getLengthOfMaxCommonSubstring(firstString, firstStringLength,
secondString, secondStringLength));
fclose(inputFile), fclose(outputFile);
return(0);
}