Problem p02597 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <chrono>
#include <cmath>
#include <fstream>
#include <iostream>
#include <set>
#include <string>
#include <vector>

using namespace std;
using namespace chrono;

typedef long long ll;
typedef long double ld;

typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef pair<ld, ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;

// #define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define loop(x, n) for (int x = 0; x < n; ++x)
#define FORd(i, a, b) for (int i = (b)-1; i >= (a); i--)
#define F0Rd(i, a) for (int i = (a)-1; i >= 0; i--)
#define trav(a, x) for (auto &a : x)

#define mp make_pair
#define pb push_back
#define ff first
#define ss second
#define lb lower_bound
#define ub upper_bound

#define sz(x) (int)x.size()
#define beg(x) x.begin()
#define en(x) x.end()
#define all(x) beg(x), en(x)
#define resz resize

const int MOD = 1000000007; // 998244353
const ll INF = 1e18;
const int MX = 100001;

string get_str() {
  string temp;
  cin >> temp;
  return temp;
}
int get_int() {
  int temp;
  cin >> temp;
  return temp;
}

void solve() {

  int n;
  string s;
  cin >> n >> s;

  int r = 0;

  loop(i, n) {
    if (s[i] == 'R') {
      r++;
    }
  }

  if (r == 0 || r == n) {
    cout << 0 << endl;
    return;
  }

  int p1 = 0, p2 = n - 1, ans = 0;

  while (p1 < p2) {
    while (p1 < p2 && s[p1] == 'R') {
      p1++;
    }
    while (p1 < p2 && s[p2] == 'W') {
      p2--;
    }

    if (p1 < p2) {
      ans++;
      p1++;
      p2--;
    }
  }
  cout << min(min(r, n - r), ans) << endl;
}

int main() { solve(); }

Error: TLE

Fixed submission:

#include <algorithm>
#include <chrono>
#include <cmath>
#include <fstream>
#include <iostream>
#include <set>
#include <string>
#include <vector>

using namespace std;
using namespace chrono;

typedef long long ll;
typedef long double ld;

typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef pair<ld, ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;

// #define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define loop(x, n) for (int x = 0; x < n; ++x)
#define FORd(i, a, b) for (int i = (b)-1; i >= (a); i--)
#define F0Rd(i, a) for (int i = (a)-1; i >= 0; i--)
#define trav(a, x) for (auto &a : x)

#define mp make_pair
#define pb push_back
#define ff first
#define ss second
#define lb lower_bound
#define ub upper_bound

#define sz(x) (int)x.size()
#define beg(x) x.begin()
#define en(x) x.end()
#define all(x) beg(x), en(x)
#define resz resize

const int MOD = 1000000007; // 998244353
const ll INF = 1e18;
const int MX = 100001;

string get_str() {
  string temp;
  cin >> temp;
  return temp;
}
int get_int() {
  int temp;
  cin >> temp;
  return temp;
}

void solve() {

  int n;
  string s;
  cin >> n >> s;

  int r = 0;
  set<int> rs, ws;

  loop(i, n) {
    if (s[i] == 'R') {
      r++;
      rs.insert(i);
    } else
      ws.insert(i);
  }

  if (r == 0 || r == n) {
    cout << 0 << endl;
    return;
  }

  int rind = rs.size() - 1;
  int ans = 0;
  loop(i, ws.size()) {
    if (rind >= 0) {
      if (*next(ws.begin(), i) < *next(rs.begin(), rind)) {
        ans++;
        rind--;
        // cout << *next(ws.begin(), i) << " " << *next(rs.begin(), rind) <<
        // endl;
      } else {
        break;
      }
    } else {
      break;
    }
  }

  // cout << r << " " << n-r << " " << ans << endl;

  cout << min(min(r, n - r), ans) << endl;
}

int main() { solve(); }