#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int lcs(const char* s1, const char* s2)
{
size_t sz = (l1 + 1) * (l2 + 1) * sizeof(size_t);
size_t w = l2 + 1;
size_t* dpt;
size_t i1, i2;
if (sz / (l1 + 1) / (l2 + 1) != sizeof(size_t) ||
{
printf("Not enough memory\n"); return EXIT_FAILURE;
}
for (i1 = 0; i1 <= l1; i1++)
dpt[w * i1 + 0] = 0;
for (i2 = 0; i2 <= l2; i2++)
dpt[w * 0 + i2] = 0;
for (i1 = 1; i1 <= l1; i1++)
for (i2 = 1; i2 <= l2; i2++)
{
if (s1[l1 - i1] == s2[l2 - i2])
{
dpt[w * i1 + i2] = dpt[w * (i1 - 1) + (i2 - 1)] + 1;
}
else if (dpt[w * (i1 - 1) + i2] > dpt[w * i1 + (i2 - 1)])
{
dpt[w * i1 + i2] = dpt[w * (i1 - 1) + i2];
}
else
{
dpt[w * i1 + i2] = dpt[w * i1 + (i2 - 1)];
}
}
i1 = l1; i2 = l2;
for (;;)
{
if ((i1 > 0) && (i2 > 0) && (s1[l1 - i1] == s2[l2 - i2]))
{
i1--; i2--; continue;
}
else
{
if (i1 > 0 &&
(i2 == 0 || dpt[w * (i1 - 1) + i2] >= dpt[w * i1 + (i2 - 1)]))
{
i1--; continue;
}
else if (i2 > 0 &&
(i1 == 0 || dpt[w * (i1 - 1) + i2] < dpt[w * i1 + (i2 - 1)]))
{
i2--; continue;
}
}
break;
}
return EXIT_SUCCESS;
}
int main(int argc, char** argv)
{
const char *s1, *s2;
if (argc == 3)
{
s1 = argv[1]; s2 = argv[2];
}
else
{
printf("Usage:\n lcs-diff.exe <string1> <string2>\n\n"); s1 = "I ate apple on yesterday"; s2 = "I eat apple yesterday";
printf("Sample comparison:\n\n \"%s\" vs \"%s\":\n\n", s1
, s2
); }
return lcs(s1, s2);
}
I2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKaW50IGxjcyhjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpCnsKICBzaXplX3QgbDEgPSBzdHJsZW4oczEpLCBsMiA9IHN0cmxlbihzMik7CiAgc2l6ZV90IHN6ID0gKGwxICsgMSkgKiAobDIgKyAxKSAqIHNpemVvZihzaXplX3QpOwogIHNpemVfdCB3ID0gbDIgKyAxOwogIHNpemVfdCogZHB0OwogIHNpemVfdCBpMSwgaTI7CgogIGlmIChzeiAvIChsMSArIDEpIC8gKGwyICsgMSkgIT0gc2l6ZW9mKHNpemVfdCkgfHwKICAgICAgKGRwdCA9IG1hbGxvYyhzeikpID09IE5VTEwpCiAgewogICAgcHJpbnRmKCJOb3QgZW5vdWdoIG1lbW9yeVxuIik7CiAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogIH0KCiAgZm9yIChpMSA9IDA7IGkxIDw9IGwxOyBpMSsrKQogICAgZHB0W3cgKiBpMSArIDBdID0gMDsKICBmb3IgKGkyID0gMDsgaTIgPD0gbDI7IGkyKyspCiAgICBkcHRbdyAqIDAgKyBpMl0gPSAwOwoKICBmb3IgKGkxID0gMTsgaTEgPD0gbDE7IGkxKyspCiAgICBmb3IgKGkyID0gMTsgaTIgPD0gbDI7IGkyKyspCiAgICB7CiAgICAgIGlmIChzMVtsMSAtIGkxXSA9PSBzMltsMiAtIGkyXSkKICAgICAgewogICAgICAgIGRwdFt3ICogaTEgKyBpMl0gPSBkcHRbdyAqIChpMSAtIDEpICsgKGkyIC0gMSldICsgMTsKICAgICAgfQogICAgICBlbHNlIGlmIChkcHRbdyAqIChpMSAtIDEpICsgaTJdID4gZHB0W3cgKiBpMSArIChpMiAtIDEpXSkKICAgICAgewogICAgICAgIGRwdFt3ICogaTEgKyBpMl0gPSBkcHRbdyAqIChpMSAtIDEpICsgaTJdOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGRwdFt3ICogaTEgKyBpMl0gPSBkcHRbdyAqIGkxICsgKGkyIC0gMSldOwogICAgICB9CiAgICB9CgogIGkxID0gbDE7IGkyID0gbDI7CiAgZm9yICg7OykKICB7CiAgICBpZiAoKGkxID4gMCkgJiYgKGkyID4gMCkgJiYgKHMxW2wxIC0gaTFdID09IHMyW2wyIC0gaTJdKSkKICAgIHsKICAgICAgcHJpbnRmKCIlYyIsIHMxW2wxIC0gaTFdKTsKICAgICAgaTEtLTsgaTItLTsgY29udGludWU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGlmIChpMSA+IDAgJiYKICAgICAgICAgIChpMiA9PSAwIHx8IGRwdFt3ICogKGkxIC0gMSkgKyBpMl0gPj0gZHB0W3cgKiBpMSArIChpMiAtIDEpXSkpCiAgICAgIHsKICAgICAgICBwcmludGYoIi0lYyIsIHMxW2wxIC0gaTFdKTsKICAgICAgICBpMS0tOyBjb250aW51ZTsKICAgICAgfQogICAgICBlbHNlIGlmIChpMiA+IDAgJiYKICAgICAgICAgICAgICAgKGkxID09IDAgfHwgZHB0W3cgKiAoaTEgLSAxKSArIGkyXSA8IGRwdFt3ICogaTEgKyAoaTIgLSAxKV0pKQogICAgICB7CiAgICAgICAgcHJpbnRmKCIrJWMiLCBzMltsMiAtIGkyXSk7CiAgICAgICAgaTItLTsgY29udGludWU7CiAgICAgIH0KICAgIH0KCiAgICBicmVhazsKICB9CiAgcHJpbnRmKCJcbiIpOwoKICBmcmVlKGRwdCk7CiAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQp7CiAgY29uc3QgY2hhciAqczEsICpzMjsKICBpZiAoYXJnYyA9PSAzKQogIHsKICAgIHMxID0gYXJndlsxXTsgczIgPSBhcmd2WzJdOwogIH0KICBlbHNlCiAgewogICAgcHJpbnRmKCJVc2FnZTpcbiAgbGNzLWRpZmYuZXhlIDxzdHJpbmcxPiA8c3RyaW5nMj5cblxuIik7CiAgICBzMSA9ICJJIGF0ZSBhcHBsZSBvbiB5ZXN0ZXJkYXkiOyBzMiA9ICJJIGVhdCBhcHBsZSB5ZXN0ZXJkYXkiOwogICAgcHJpbnRmKCJTYW1wbGUgY29tcGFyaXNvbjpcblxuICBcIiVzXCIgdnMgXCIlc1wiOlxuXG4iLCBzMSwgczIpOwogIH0KCiAgcmV0dXJuIGxjcyhzMSwgczIpOwp9Cg==