Cod sursa(job #2217239)

Utilizator petru.ciocirlanPetru Ciocirlan petru.ciocirlan Data 29 iunie 2018 17:57:15
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#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);
}