Problem:
Score : 100 points

Problem Statement

You are given a grid with 2 rows and 3 columns of squares.
The color of the square at the i-th row and j-th column is represented by the character C_{ij}.

Write a program that prints YES if this grid remains the same when rotated 180 degrees, and prints NO otherwise.

Constraints

C_{i,j}(1 \leq i \leq 2, 1 \leq j \leq 3) is a lowercase English letter.

Input

Input is given from Standard Input in the following format:

C_{11}C_{12}C_{13}
C_{21}C_{22}C_{23}

Output

Print YES if this grid remains the same when rotated 180 degrees; print NO otherwise.

Sample Input 1

pot
top

Sample Output 1

YES

This grid remains the same when rotated 180 degrees.

Sample Input 2

tab
bet

Sample Output 2

NO

This grid does not remain the same when rotated 180 degrees.

Sample Input 3

eye
eel

Sample Output 3

NO

Solution in C (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<stdio.h>
#include<stdlib.h>

int *binary_search(int *array, size_t size, int value){
 int lower=0;
 int upper=(int)size - 1;

 while(lower <= upper){
  int mid = (lower + upper) /2;

  if( array[mid] == value){
    return &array[mid];
  }else if(array[mid] < value){
    lower = mid + 1;
  }else if(array[mid] > value){
    upper = mid - 1;
  }
 }

  return NULL;
}

int compare(int a, int b){
  if(a <= b){
    return -1;
  }else if(a > b){
    return 1;
  }
  return 0;
}

//イテレーターを返す
int lower_bound(int *array, int len, int value){
  int l=0, r=len - 1;

  while(l <= r){
    int mid = l + (r-l)/2;
    int res = compare(array[mid], value);
    if(res == -1){
      l = mid + 1;
    }else{
      r = mid - 1;
    }
  }

  return l;
}

void merge_sort (int array[], int left, int right) {
  int i, j, k, mid;
  int work[10];  //work array
  if (left < right) {
    mid = (left + right)/2;
    merge_sort(array, left, mid);  //sort left
    merge_sort(array, mid+1, right);  //sort right
    for (i = mid; i >= left; i--) { work[i] = array[i]; } //left section
    for (j = mid+1; j <= right; j++) {
      work[right-(j-(mid+1))] = array[j]; //right section
    }
    i = left; j = right;
    for (k = left; k <= right; k++) {
      if (work[i] < work[j]) { array[k] = work[i++]; }
      else                   { array[k] = work[j--]; }
    }
  }
}


int main(void){
  int n;
  int *a,*b,*c;

  scanf("%d", &n);
  a = (int *)malloc(sizeof(int) * n); 
  b = (int *)malloc(sizeof(int) * n); 
  c = (int *)malloc(sizeof(int) * n); 

  int temp;
  for(size_t i = 0; i < n;i++){
    scanf("%d", &temp);
    *(a+i) = temp;
  }
  merge_sort(a, 0, n-1);
  for(size_t i = 0; i < n;i++){
    scanf("%d", &temp);
    *(b+i) = temp;
  }
  merge_sort(b, 0, n-1);
  for(size_t i = 0; i < n;i++){
    scanf("%d", &temp);
    *(c+i) = temp;
  }
  merge_sort(c, 0, n-1);
  for(size_t i =0;i<n;i++){
    printf("%d ", a[i]);
  }
  printf("\n");
  for(size_t i =0;i<n;i++){
    printf("%d ", b[i]);
  }
  printf("\n");
  for(size_t i =0;i<n;i++){
    printf("%d ", c[i]);
  }
  printf("\n");

  //上部の数字を選択、上部より大きい中部を選択、中部より大きい下部を選択
  int up,mid,low;
  int count=0;
  int add=0;
  for(size_t i = 0;i < n;i++){
    low = c[i];
    mid = lower_bound(b, n, low);
    //printf("mid:%d\n", mid);
    if(low < b[mid-1])continue;
    if(low == b[mid-1])mid--;
    for(size_t j=0;j < mid;j++){
      up = add = lower_bound(a, n, b[j]);
      //printf("up:%d\n",up);
      if(b[j] == a[up-1])add--;
      count += add;
    }
  }
  printf("%d\n",count);
  return 0;
}