Problem p03231 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <bitset>
#include <climits>
#include <functional>
#include <iomanip>
#include <iostream>
#include <math.h>
#include <numeric>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <utility>
#include <vector>
using namespace std;
using ll = long long;

typedef pair<int, int> pii;

int main() {

  ll a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0, h = 0, ans = 0;
  // cout << LONG_MAX << endl;
  // long long n, A[1000000000];
  // ll n, m, q;
  string s, t;
  ll n, m;
  cin >> n;
  cin >> m;
  if (n >= m) {
    cin >> s;
    cin >> t;
  } else {
    cin >> t;
    cin >> s;
    swap(n, m);
  }
  a = n;
  b = m;
  ll x = a * b;
  ll tmp;
  /* 自然数 a > b を確認・入替 */
  if (a < b) {
    tmp = a;
    a = b;
    b = tmp;
  }

  /* ユークリッドの互除法 */
  ll r = a % b;
  while (r != 0) {
    a = b;
    b = r;
    r = a % b;
  }
  a = x / b;
  // b = min(a / n, a / m);
  // c = max(a / n, a / m);
  b = a / n;
  c = a / m;
  d = 0;
  for (int i = 0; i < a; i += c) {
    // if (i>d)
    //{
    //	d += c;
    // }
    while (i > d) {
      d += b;
    }

    if (i == d) {
      if (s[i / b] != t[i / c]) {
        cout << -1 << endl;
        return 0;
      }
    }
  }

  cout << a << endl;
  // cout <<  << endl;

  ////std::cout << std::fixed;
  // cout << std::setprecision(20) << << endl;
  // cout << d+1 << endl;
  // cout << "" << endl;

  return 0;
}
// accumulate(x, x + a, 0);
// memcpy(x, visited, sizeof(ll)*n);
// void kansuu(ll num, ll visited[10]) {}
// kansuu(1, zz);
// cout << setprecision(15) << v << endl;
// cout << char(z - 'a');
// log10(i) + 1 //10進数の桁数を取得

// int temp;
// for (int i = 0; i < n - 1; i++) {
//	for (int j = n - 1; j > i; j--) {
//		if (w[j - 1] < w[j]) {  /* 前の要素の方が大きかったら */
//			temp = w[j];        /* 交換する */
//			w[j] = w[j - 1];
//			w[j - 1] = temp;
//		}
//	}
// }


Fixed submission:
#include <algorithm>
#include <bitset>
#include <climits>
#include <functional>
#include <iomanip>
#include <iostream>
#include <math.h>
#include <numeric>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <utility>
#include <vector>
using namespace std;
using ll = long long;

typedef pair<int, int> pii;

int main() {

  ll a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0, h = 0, ans = 0;
  // cout << LONG_MAX << endl;
  // long long n, A[1000000000];
  // ll n, m, q;
  string s, t;
  ll n, m;
  cin >> n;
  cin >> m;
  if (n >= m) {
    cin >> s;
    cin >> t;
  } else {
    cin >> t;
    cin >> s;
    swap(n, m);
  }
  a = n;
  b = m;
  ll x = a * b;
  ll tmp;
  /* 自然数 a > b を確認・入替 */
  if (a < b) {
    tmp = a;
    a = b;
    b = tmp;
  }

  /* ユークリッドの互除法 */
  ll r = a % b;
  while (r != 0) {
    a = b;
    b = r;
    r = a % b;
  }
  a = x / b;
  // b = min(a / n, a / m);
  // c = max(a / n, a / m);
  b = a / n;
  c = a / m;
  d = 0;
  for (ll i = 0; i < a; i += c) {
    // if (i>d)
    //{
    //	d += c;
    // }
    while (i > d) {
      d += b;
    }

    if (i == d) {
      if (s[i / b] != t[i / c]) {
        cout << -1 << endl;
        return 0;
      }
    }
  }

  cout << a << endl;
  // cout <<  << endl;

  ////std::cout << std::fixed;
  // cout << std::setprecision(20) << << endl;
  // cout << d+1 << endl;
  // cout << "" << endl;

  return 0;
}
// accumulate(x, x + a, 0);
// memcpy(x, visited, sizeof(ll)*n);
// void kansuu(ll num, ll visited[10]) {}
// kansuu(1, zz);
// cout << setprecision(15) << v << endl;
// cout << char(z - 'a');
// log10(i) + 1 //10進数の桁数を取得

// int temp;
// for (int i = 0; i < n - 1; i++) {
//	for (int j = n - 1; j > i; j--) {
//		if (w[j - 1] < w[j]) {  /* 前の要素の方が大きかったら */
//			temp = w[j];        /* 交換する */
//			w[j] = w[j - 1];
//			w[j - 1] = temp;
//		}
//	}
// }