Problem p02891 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define endl "\n"
#define REP(i, a, n) for (int i = a; i < n; ++i)
#define REPR(i, a, n) for (int i = a; i > n; --i)
#define RUP(a, b) ((a + b - 1) / (b))
#define ALL(v) (v).begin(), (v).end()
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define MOD 1000000007
#define INF LLONG_MAX / 2

typedef long long ll;
typedef pair<int, int> Pii;
typedef tuple<int, int, int> Tiii;
typedef vector<int> Vi;
typedef vector<Vi> VVi;
typedef vector<Pii> VPii;
typedef vector<string> Vs;

template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> void YesNo(T a) { cout << (a ? "Yes" : "No") << endl; }
template <class T> void YESNO(T a) { cout << (a ? "YES" : "NO") << endl; }
void vin(Vi &v) { REP(i, 0, (v).size()) cin >> v[i]; }
void vin(Vi &v, Vi &v2) { REP(i, 0, (v).size()) cin >> v[i] >> v2[i]; }
void vout(Vi &v) {
  for (int i = 0; i < (v).size(); i++)
    cout << v[i] << " ";
  cout << endl;
}
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int lcm(int a, int b) { return a / gcd(a, b) * b; }
void uniq(Vi &v) {
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
}
int ctoi(char c) {
  if (c >= '0' && c <= '9') {
    return c - '0';
  }
  return 0;
}
void accum(Vi &v) { REP(i, 1, (v).size()) v[i] += v[i - 1]; }
bool comp(Pii a, Pii b) {
  if (a.second != b.second)
    return a.second < b.second;
  else
    return a.first < b.first;
}

void solve(std::string s, long long k) {
  Vi a;
  int now = 1, ans = 0;
  REP(i, 1, s.size()) {
    if (s[i] == s[i - 1]) {
      now++;
    } else {
      a.pb(now);
      now = 1;
    }
    if (i == s.size() - 1)
      a.pb(now);
  }
  if (a.size() == 1) {
    cout << (s.size() * k) / 2 << endl;
    return;
  }
  if (s[0] != s[s.size() - 1])
    REP(i, 0, a.size()) ans += (a[i] / 2) * k;
  else {
    REP(i, 1, a.size() - 1) ans += (a[i] / 2) * k;
    ans += a[0] / 2;
    ans += a[a.size() - 1] / 2;
    ans += (a[0] + a[a.size() - 1]) / 2 * (k - 1);
  }
  cout << ans << endl;
}

// Generated by 1.1.5 https://github.com/kyuridenamida/atcoder-tools  (tips: You
// use the default template now. You can remove this line by using your custom
// template)
signed main() {
  std::string S;
  std::cin >> S;
  long long K;
  scanf("%lld", &K);
  solve(S, K);
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define endl "\n"
#define REP(i, a, n) for (int i = a; i < n; ++i)
#define REPR(i, a, n) for (int i = a; i > n; --i)
#define RUP(a, b) ((a + b - 1) / (b))
#define ALL(v) (v).begin(), (v).end()
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define MOD 1000000007
#define INF LLONG_MAX / 2

typedef long long ll;
typedef pair<int, int> Pii;
typedef tuple<int, int, int> Tiii;
typedef vector<int> Vi;
typedef vector<Vi> VVi;
typedef vector<Pii> VPii;
typedef vector<string> Vs;

template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> void YesNo(T a) { cout << (a ? "Yes" : "No") << endl; }
template <class T> void YESNO(T a) { cout << (a ? "YES" : "NO") << endl; }
void vin(Vi &v) { REP(i, 0, (v).size()) cin >> v[i]; }
void vin(Vi &v, Vi &v2) { REP(i, 0, (v).size()) cin >> v[i] >> v2[i]; }
void vout(Vi &v) {
  for (int i = 0; i < (v).size(); i++)
    cout << v[i] << " ";
  cout << endl;
}
int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
int lcm(int a, int b) { return a / gcd(a, b) * b; }
void uniq(Vi &v) {
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
}
int ctoi(char c) {
  if (c >= '0' && c <= '9') {
    return c - '0';
  }
  return 0;
}
void accum(Vi &v) { REP(i, 1, (v).size()) v[i] += v[i - 1]; }
bool comp(Pii a, Pii b) {
  if (a.second != b.second)
    return a.second < b.second;
  else
    return a.first < b.first;
}

void solve(std::string s, long long k) {
  Vi a;
  int now = 1, ans = 0;
  if (s.size() == 1) {
    cout << k / 2 << endl;
    return;
  }
  REP(i, 1, s.size()) {
    if (s[i] == s[i - 1]) {
      now++;
    } else {
      a.pb(now);
      now = 1;
    }
    if (i == s.size() - 1)
      a.pb(now);
  }
  if (a.size() == 1) {
    cout << (s.size() * k) / 2 << endl;
    return;
  }
  if (s[0] != s[s.size() - 1])
    REP(i, 0, a.size()) ans += (a[i] / 2) * k;
  else {
    REP(i, 1, a.size() - 1) ans += (a[i] / 2) * k;
    ans += a[0] / 2;
    ans += a[a.size() - 1] / 2;
    ans += (a[0] + a[a.size() - 1]) / 2 * (k - 1);
  }
  cout << ans << endl;
}

// Generated by 1.1.5 https://github.com/kyuridenamida/atcoder-tools  (tips: You
// use the default template now. You can remove this line by using your custom
// template)
signed main() {
  std::string S;
  std::cin >> S;
  long long K;
  scanf("%lld", &K);
  solve(S, K);
  return 0;
}