Code:
#include <stdio.h>
#include <stdlib.h>
int findSherLockPairs();
void mergeSort(int *, int, int);
void mergeArray(int *, int, int, int);
int binarySearch(int *, int, int);
int countSherlockPairs(int *, int, int, int);
int main()
{
int numOfTestCases, index, numOfSherLockPairs;
scanf("%d", &numOfTestCases);
for(index = 0; index < numOfTestCases; index++)
{
numOfSherLockPairs = findSherLockPairs();
printf("%d\n", numOfSherLockPairs);
}
return 0;
}
int findSherLockPairs()
{
int sizeOfArray, index;
scanf("%d", &sizeOfArray);
int *arr = malloc(sizeof(int) * sizeOfArray);
for(index = 0; index < sizeOfArray; index++)
{
scanf("%d", &arr[index]);
}
mergeSort(arr, 0, sizeOfArray - 1);
int numberOfSherlockPairs = 0, prevNumber = -1;
for(index = 0; index < sizeOfArray; index++)
{
if(prevNumber != arr[index])
{
numberOfSherlockPairs += binarySearch(arr, sizeOfArray, arr[index]);
prevNumber = arr[index];
}
}
free(arr);
return numberOfSherlockPairs;
}
void mergeSort(int *arr, int low, int high)
{
if(low < high)
{
int middle = (high + low) / 2;
mergeSort(arr, low, middle);
mergeSort(arr, middle + 1, high);
mergeArray(arr, low, middle, high);
}
}
void mergeArray(int *arr, int low, int middle, int high)
{
int *mergedArray = malloc(sizeof(int) * (high - low + 1));
int leftSide = low, rightSide = middle + 1, mergedIndex = 0;
while(leftSide <= middle && rightSide <= high)
{
if(arr[leftSide] <= arr[rightSide])
{
mergedArray[mergedIndex++] = arr[leftSide++];
}
else
mergedArray[mergedIndex++] = arr[rightSide++];
}
while(leftSide <= middle)
{
mergedArray[mergedIndex++] = arr[leftSide++];
}
while(rightSide <= high)
{
mergedArray[mergedIndex++] = arr[rightSide++];
}
while(mergedIndex > 0)
{
arr[low + mergedIndex - 1] = mergedArray[mergedIndex - 1];
mergedIndex--;
}
free(mergedArray);
}
int binarySearch(int *arr, int sizeOfArray, int target)
{
int low = 0;
int high = sizeOfArray - 1;
int middle;
int numOfSherlockPairs = 0;
while(low <= high)
{
middle = (low + high) / 2;
if(arr[middle] == target)
{
numOfSherlockPairs = countSherlockPairs(arr, sizeOfArray, target, middle);
break;
}
else if(arr[middle] < target)
{
low = middle + 1;
}
else
high = middle - 1;
}
return numOfSherlockPairs;
}
int countSherlockPairs(int *arr, int sizeOfArray, int target, int middle)
{
int numOfSherlockPairs = 1, index;
for(index = middle - 1; index >= 0; index--)
{
if(arr[index] == target)
{
numOfSherlockPairs++;
}
else
break;
}
for(index = middle + 1; index < sizeOfArray; index++)
{
if(arr[index] == target)
{
numOfSherlockPairs++;
}
else
break;
}
return numOfSherlockPairs * (numOfSherlockPairs - 1);
}