Why Runtime error (access violation) ?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_READ 250000
#define MASIVE(a, b) (b *) malloc(sizeof(b *)*(a))
#define STRING(a) MASIVE((a), char);
#define R_CONCAT(T,S,A) strcat(A, T); \
strcat(A, " "); \
strcat(A, S); \
int * Z_simple(char * str, int len) {
int * z = MASIVE(len, int);
for (int i = 1; i < len; i++) {
int * val = z + i;
*val = 0;
for (int j = 0; i + j < len; j++) {
if (str[i + j] != str[j]) {
break;
}
(*val)++;
}
}
return z;
}
int * Z(char * str, int len) {
int * z = MASIVE(len, int);
int l = 0, r = 0;
for (int k = 1; k < len; k++) {
if (k > r) {
l = k;
int pos = 0;
while (k + pos < len && str[pos] == str[k + pos]) {
pos++;
}
if (pos == 0) {
r = l;
z[k] = 0;
} else {
r = k + pos - 1;
z[k] = pos;
}
} else {
int m = k - l;
int b = z[l] - m;
if (z[m] < b) {
z[k] = z[m];
} else {
int pos1 = b;
int pos2 = k + b;
int pos = 0;
while(pos2 + pos < len && str[pos1 + pos] == str[pos2+pos]) {
pos ++;
}
if (pos != 0) {
l = k;
r = pos2 + pos - 1;
z[k] = b + pos;
} else {
z[k] = b;
}
}
}
}
return z;
}
int main() {
int n;
int result = -1;
scanf("%d", &n);
char * T = STRING(n);
char * S = STRING(n);
scanf("%s%s", T, S);
int len_N = 2*n + 1;
char * N = STRING(len_N);
R_CONCAT(T,S,N);
int * z = Z(N, len_N);
z = z + (n + 1);
for (int i = 0; i < n; i++) {
if (z[i] == n - i) {
int k = z[i];
int b = 0;
for (int j = 0; j < i; j++) {
if (T[k + j] != S[j]) {
b = 1;
break;
}
}
if (b == 0)
result = i;
break;
}
}
printf("%d", result);
}