#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* merge_on_overlap(const char* a, const char* b) {
size_t len_a = strlen(a);
size_t len_b = strlen(b);
size_t max_possible_overlap_len = len_a < len_b ? len_a : len_b;
size_t overlap = 0;
// Try longest overlap first
for (size_t len = max_possible_overlap_len; len > 0; len--) {
if (strncmp(a + (len_a - len), b, len) == 0) {
overlap = len;
break;
}
}
// Allocate result: a + (b minus overlap) + null terminator
size_t result_len = len_a + (len_b - overlap);
char* result = malloc(result_len + 1);
if (!result) return NULL;
memcpy(result, a, len_a);
memcpy(result + len_a, b + overlap, len_b - overlap);
result[result_len] = '\0';
return result;
}
int main(void) {
const char* a = "fantasy time travel technology";
const char* b = "technology extraterrestrial life";
char* merged = merge_on_overlap(a, b);
if (merged) {
printf("%s\n", merged);
free(merged);
}
}
/*
run:
fantasy time travel technology extraterrestrial life
*/