Your code would be a lot easier to understand if you renamed your variables. Don't do this just for others. Do it for yourself. If you look at this code a few months later, I bet you yourself will have trouble reading it. Rename the variables until the logic just flows. When the comments become pointless, you have succeeded (and then can drop the comments too).

In addition to what others already pointed out, I would just point out some things you could simplify.

Instead of these pointer arithmetics:

    id = (*(a[0]+d) >= '0' && *(a[0]+d) <= '9') ? '0' : 'A';
    count[*(a[i]+d) - id + 1]++;
    aux[count[(*(a[i]+d) - id)]++] = a[i];
    lsd_string_sort(&plates[0], n, PLATELENGTH);

You could write more intuitively:

    id = a[0][d] >= '0' && a[0][d] <= '9' ? '0' : 'A';
    count[a[i][d] - id + 1]++;
    aux[count[(a[i][d] - id)]++] = a[i];
    lsd_string_sort(plates, n, PLATELENGTH);

These seem pointless statements:

    char* plates[1000] = {0};
    int arr[10] = {0};

You can just keep the declarations:

    char* plates[1000];
    int arr[10];