Problem p03231 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <cmath>
#include <iostream>
#include <limits>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef int itn;
typedef vector<int> vi;
typedef vector<ll> vl;

const int inf = numeric_limits<int>::max() >> 2;
const ll linf = numeric_limits<ll>::max() >> 2;
const ull ulinf = numeric_limits<ull>::max() >> 2;
const double pi = acos(-1);
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};
const int dx8[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
const int dy8[8] = {-1, -1, -1, 0, 0, 1, 1, 1};

#define p_queue(i) priority_queue<i>
#define rp_queue(i) priority_queue<i, vector<i>, greater<i>>
#define umap(i, j) unordered_map<i, j>
#define P(p) cout << (p) << endl
#define PS(p) cout << (p) << " "
#define IN cin >>
#define rep(i, m, n) for (int i = (m); i < (int)(n); i++)
#define rrep(i, m, n) for (int i = (m - 1); i >= (int)(n); i--)
#define inrep(n, a)                                                            \
  for (int i = 0; i < (int)(n); i++)                                           \
    cin >> a[i];
#define mod(i) ((i) % (ll)(1e9 + 7))
#define divm(a, b) (mod(a * modpow((ll)b, (ll)(1e9 + 5))))
#define rsort(a, b, c) sort(a, b, greater<c>())
#define vsort(v) sort(v.begin(), v.end())
#define rvsort(v, c) sort(v.begin(), v.end(), greater<c>())
#define ft first
#define sd second
#define pb push_back
#define it insert
#define sz(x) ((int)(x).size())
#define lb(a, n, k) (lower_bound(a, a + n, k) - a)
#define vlb(a, k) (lower_bound(a.begin(), a.end(), k) - a.begin())
#define ub(a, n, k) (upper_bound(a, a + n, k) - a)
#define vub(a, k) (upper_bound(a.begin(), a.end(), k) - a.begin())
#define YES cout << "YES" << endl
#define NO cout << "NO" << endl
#define Yes cout << "Yes" << endl
#define No cout << "No" << endl
#define yes cout << "yes" << endl
#define no cout << "no" << endl
#define ret return

ll modpow(ll i, ll j) {
  ll tmp = 1;
  while (j) {
    if (j % 2)
      tmp = mod(tmp * i);
    i = mod(i * i);
    j /= 2;
  }
  return tmp;
}
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }

vector<string> split(const string &str, char sep) {
  vector<string> v;
  stringstream ss(str);
  string buffer;
  while (getline(ss, buffer, sep)) {
    v.push_back(buffer);
  }
  return v;
}

// ll ncr[100][100];
// ll nCr(int n, int r){if(n==r) ret ncr[n][r] = 1; if(r==0) ret ncr[n][r] = 1;
// if(r==1) ret ncr[n][r] = n;if(ncr[n][r]) ret ncr[n][r]; ret ncr[n][r] =
// nCr(n-1,r) + nCr(n-1,r-1);}

// ll npr[100][100]={};
// ll nPr(int n,int r){if(npr[n][r])ret npr[n][r];if(r==0)ret npr[n][r] =
// 1;if(r==1)ret npr[n][r] = n;ret npr[n][r] = n * nPr(n-1,r-1);}

// ll nHr(int n,int r){ret nCr(n+r-1,r);}

///////////////////////////////////////////////////////////////////////////

ll n, m;
string s, t;

int main() {

  cin >> n >> m;
  cin >> s >> t;

  if (s[0] != t[0]) {
    P(-1);
    ret 0;
  }

  ll c = 1;
  while (c < 10000) {

    ll l = lcm(n, m) * c;

    map<int, char> a;

    rep(i, 1, n) { a[i * (l / n) + 1] = s[i]; }

    int f = 0;
    rep(i, 1, m) {
      if (a[i * (l / m) + 1] == 0) {
        a[i * (l / m) + 1] = t[i];
      } else {
        if (a[i * (l / m) + 1] != t[i]) {
          c++;
          f = 1;
          break;
        } else {
          a[i * (l / m) + 1] = t[i];
        }
      }
    }
    if (f == 1)
      continue;
    P(l);
    ret 0;
  }
  P(-1);
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cmath>
#include <iostream>
#include <limits>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef int itn;
typedef vector<int> vi;
typedef vector<ll> vl;

const int inf = numeric_limits<int>::max() >> 2;
const ll linf = numeric_limits<ll>::max() >> 2;
const ull ulinf = numeric_limits<ull>::max() >> 2;
const double pi = acos(-1);
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};
const int dx8[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
const int dy8[8] = {-1, -1, -1, 0, 0, 1, 1, 1};

#define p_queue(i) priority_queue<i>
#define rp_queue(i) priority_queue<i, vector<i>, greater<i>>
#define umap(i, j) unordered_map<i, j>
#define P(p) cout << (p) << endl
#define PS(p) cout << (p) << " "
#define IN cin >>
#define rep(i, m, n) for (int i = (m); i < (int)(n); i++)
#define rrep(i, m, n) for (int i = (m - 1); i >= (int)(n); i--)
#define inrep(n, a)                                                            \
  for (int i = 0; i < (int)(n); i++)                                           \
    cin >> a[i];
#define mod(i) ((i) % (ll)(1e9 + 7))
#define divm(a, b) (mod(a * modpow((ll)b, (ll)(1e9 + 5))))
#define rsort(a, b, c) sort(a, b, greater<c>())
#define vsort(v) sort(v.begin(), v.end())
#define rvsort(v, c) sort(v.begin(), v.end(), greater<c>())
#define ft first
#define sd second
#define pb push_back
#define it insert
#define sz(x) ((int)(x).size())
#define lb(a, n, k) (lower_bound(a, a + n, k) - a)
#define vlb(a, k) (lower_bound(a.begin(), a.end(), k) - a.begin())
#define ub(a, n, k) (upper_bound(a, a + n, k) - a)
#define vub(a, k) (upper_bound(a.begin(), a.end(), k) - a.begin())
#define YES cout << "YES" << endl
#define NO cout << "NO" << endl
#define Yes cout << "Yes" << endl
#define No cout << "No" << endl
#define yes cout << "yes" << endl
#define no cout << "no" << endl
#define ret return

ll modpow(ll i, ll j) {
  ll tmp = 1;
  while (j) {
    if (j % 2)
      tmp = mod(tmp * i);
    i = mod(i * i);
    j /= 2;
  }
  return tmp;
}
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }

vector<string> split(const string &str, char sep) {
  vector<string> v;
  stringstream ss(str);
  string buffer;
  while (getline(ss, buffer, sep)) {
    v.push_back(buffer);
  }
  return v;
}

// ll ncr[100][100];
// ll nCr(int n, int r){if(n==r) ret ncr[n][r] = 1; if(r==0) ret ncr[n][r] = 1;
// if(r==1) ret ncr[n][r] = n;if(ncr[n][r]) ret ncr[n][r]; ret ncr[n][r] =
// nCr(n-1,r) + nCr(n-1,r-1);}

// ll npr[100][100]={};
// ll nPr(int n,int r){if(npr[n][r])ret npr[n][r];if(r==0)ret npr[n][r] =
// 1;if(r==1)ret npr[n][r] = n;ret npr[n][r] = n * nPr(n-1,r-1);}

// ll nHr(int n,int r){ret nCr(n+r-1,r);}

///////////////////////////////////////////////////////////////////////////

ll n, m;
string s, t;

int main() {

  cin >> n >> m;
  cin >> s >> t;

  if (s[0] != t[0]) {
    P(-1);
    ret 0;
  }

  ll c = 1;
  while (c < 10) {

    ll l = lcm(n, m) * c;

    map<int, char> a;

    rep(i, 1, n) { a[i * (l / n) + 1] = s[i]; }

    int f = 0;
    rep(i, 1, m) {
      if (a[i * (l / m) + 1] == 0) {
        a[i * (l / m) + 1] = t[i];
      } else {
        if (a[i * (l / m) + 1] != t[i]) {
          c++;
          f = 1;
          break;
        } else {
          a[i * (l / m) + 1] = t[i];
        }
      }
    }
    if (f == 1)
      continue;
    P(l);
    ret 0;
  }
  P(-1);
  return 0;
}