Problem p02730 (C++) — buggy submission, verdict: Runtime Error

#include <algorithm>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

#define NOT_FOUND -1
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
/*for文のマクロ定義
rep(i,回数){
    処理
}
*/

void swap(int *a, int *b) {
  *b = *a - *b;
  *a -= *b;
  *b += *a;
}

int sosu_judge(int N) {
  /*素数ならば1
    素数でなければ0を返す
  */
  int i, j;

  if (N == 2)
    return 1;
  if (N % 2 == 0)
    return 0;

  for (i = 3; i < N && N % i != 0; i += 2)
    ;

  if (i >= N)
    return 1;

  return 0;
}

int factorial(int N) { // Nの階乗を求める関数
  int ans = 1;

  while (N--)
    ans *= (N + 1);
  return ans;
}

// クイックソートをする関数
void q_sort(int a[], int first, int last) {
  int i, j;
  int x, t;

  x = a[(first + last) / 2];
  i = first;
  j = last;

  while (1) {
    while (a[i] < x)
      i++;
    while (x < a[j])
      j--;

    if (i >= j)
      break;

    swap(&a[i], &a[j]);
    i++;
    j--;
  }
  if (first < i - 1)
    q_sort(a, first, i - 1);
  if (last > j + 1)
    q_sort(a, j + 1, last);
}

int b_search(int target, int array[], int right, int left) {
  /*二分探索を行う関数である。
    戻り値は探索したい値の格納されている位置である。
    もし値が存在しない場合、NOT_FOUND(-1)を返す
  */
  int mid;
  while (left < right) {
    mid = (right + left) / 2;
    if (array[mid] < target)
      left = mid + 1;
    else
      right = mid;
  }
  if (array[mid] == target)
    return mid;
  return NOT_FOUND;
}

unsigned long combination(int n, int r) {
  /*nCrの値を求める関数である。
    値が巨大になる可能性があるため、戻り地はunsigned longである
  */
  int i, j;
  unsigned long a[17];

  if (n - r < r)
    r = n - r;
  if (r == 0)
    return 1;
  if (r == 1)
    return n;
  if (r > 17)
    return 0;
  for (i = 1; i < r; i++)
    a[i] = i + 2;
  for (i = 3; i <= n - r + 1; i++) {
    a[0] = i;
    for (j = 1; j < r; j++)
      a[j] += a[j - 1];
  }
  return a[r - 1];
}

int main() {
  string S;
  size_t len, tmp;
  int i, j, k;

  cin >> S;

  len = S.length();
  tmp = len;

  for (i = 0; i < len / 2; i++) {
    if (S[i] != S[len - i - 1]) {
      cout << "No" << endl;
      return (0);
    }
  }
  len = (len - 1) / 2;

  for (i = 0; i < len / 2; i++) {
    if (S[i] != S[len - i - 1]) {
      cout << "No" << endl;
      return (0);
    }
  }
  len = tmp;
  for (i = (len + 3) / 2; i < len; i++) {
    if (S[i] != S[len - i - 1]) {
      cout << "No" << endl;
      return (0);
    }
  }
  cout << "Yes" << endl;
  return (0);
}


Error: 0

Fixed submission:

#include <algorithm>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

#define NOT_FOUND -1
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
/*for文のマクロ定義
rep(i,回数){
    処理
}
*/

void swap(int *a, int *b) {
  *b = *a - *b;
  *a -= *b;
  *b += *a;
}

int sosu_judge(int N) {
  /*素数ならば1
    素数でなければ0を返す
  */
  int i, j;

  if (N == 2)
    return 1;
  if (N % 2 == 0)
    return 0;

  for (i = 3; i < N && N % i != 0; i += 2)
    ;

  if (i >= N)
    return 1;

  return 0;
}

int factorial(int N) { // Nの階乗を求める関数
  int ans = 1;

  while (N--)
    ans *= (N + 1);
  return ans;
}

// クイックソートをする関数
void q_sort(int a[], int first, int last) {
  int i, j;
  int x, t;

  x = a[(first + last) / 2];
  i = first;
  j = last;

  while (1) {
    while (a[i] < x)
      i++;
    while (x < a[j])
      j--;

    if (i >= j)
      break;

    swap(&a[i], &a[j]);
    i++;
    j--;
  }
  if (first < i - 1)
    q_sort(a, first, i - 1);
  if (last > j + 1)
    q_sort(a, j + 1, last);
}

int b_search(int target, int array[], int right, int left) {
  /*二分探索を行う関数である。
    戻り値は探索したい値の格納されている位置である。
    もし値が存在しない場合、NOT_FOUND(-1)を返す
  */
  int mid;
  while (left < right) {
    mid = (right + left) / 2;
    if (array[mid] < target)
      left = mid + 1;
    else
      right = mid;
  }
  if (array[mid] == target)
    return mid;
  return NOT_FOUND;
}

unsigned long combination(int n, int r) {
  /*nCrの値を求める関数である。
    値が巨大になる可能性があるため、戻り地はunsigned longである
  */
  int i, j;
  unsigned long a[17];

  if (n - r < r)
    r = n - r;
  if (r == 0)
    return 1;
  if (r == 1)
    return n;
  if (r > 17)
    return 0;
  for (i = 1; i < r; i++)
    a[i] = i + 2;
  for (i = 3; i <= n - r + 1; i++) {
    a[0] = i;
    for (j = 1; j < r; j++)
      a[j] += a[j - 1];
  }
  return a[r - 1];
}

int main() {
  string S;
  size_t len, tmp;
  int i, j, k;

  cin >> S;

  len = S.length();
  tmp = len;

  for (i = 0; i < len / 2; i++) {
    if (S[i] != S[len - i - 1]) {
      cout << "No" << endl;
      return (1);
    }
  }
  len = (len - 1) / 2;

  for (i = 0; i < len / 2; i++) {
    if (S[i] != S[len - i - 1]) {
      cout << "No" << endl;
      return (1);
    }
  }
  len = tmp;
  for (i = (len + 3) / 2; i < len; i++) {
    if (S[i] != S[len - i - 1]) {
      cout << "No" << endl;
      return (1);
    }
  }
  cout << "Yes" << endl;
  return (0);
}