Такие программы надо писать, думая сперва головой.
Зачем составлять 2 списка? Все это делается в 1 проход.
Код:
var
arr: array[0..5] of string;
L : TStringList;
I, Idx : Integer;
begin
arr[0] := 'a';
arr[1] := 'b';
arr[2] := 'c';
arr[3] := 'a';
arr[4] := 'a';
arr[5] := 'b';
L := TStringList.Create;
For I := 0 To 5 Do
Begin
Idx := IndexOf(arr[i]);
If Idx >= 0
Then L.Objects[Idx] := TObject(Integer(L.Objects[Idx]) + 1)
Else L.AddObject(arr[i],TObject(1));
End;
For I := 0 To L.Count-1 Do
WriteLn(L[i],' -> ',Integer(L.Objects[i]));
L.Free;
Как-то так.