#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
using namespace std;
#define null NULL
#define ll long long
#define maxn 2000001
#define inf 1000000000
class node {
public:
int l, r;
int weight;
node(int l, int r, int weight) {
this->l = l;
this->r = r;
this->weight = weight;
}
bool operator<(const node& b)const {
if (weight > b.weight) {
return true;
}
if (weight == b.weight && l > b.l) {
return true;
}
return false;
}
};
class ans {
public:
int l;
int r;
ans(int l, int r) {
this->l = l;
this->r = r;
}
};
priority_queue<node>qu;
int n;
string x;
int num[maxn];
int before[maxn];
int after[maxn];
bool flag[maxn];
vector<ans>anss;
int main() {
scanf("%d", &n);
cin >> x;
for (int i = 1; i <= n; ++i) {
scanf("%d", &num[i]);
}
x += 'H';
for (int i = 1; i <= n - 1; ++i) {
if (x[i - 1] != x[i]) {
qu.push(node(i, i + 1, abs(num[i] - num[i + 1])));
}
}
for (int i = 1; i <= n; ++i) {
before[i] = i - 1;
after[i] = i + 1;
}
while (!qu.empty()) {
node tmp = qu.top();
qu.pop();
int l = tmp.l;
int r = tmp.r;
if (flag[l] == false && flag[r] == false) {
after[before[l]] = after[r];
before[after[r]] = before[l];
anss.push_back(ans(l, r));
flag[l] = true;
flag[r] = true;
if (!flag[before[l]] && !flag[after[r]]) {
if ((x[before[l] - 1] + x[after[r] - 1]) == ('G' + 'B')) {
qu.push(node(before[l], after[r], abs(num[before[l]] - num[after[r]])));
}
}
}
}
printf("%d\n", anss.size());
for (int i = 0; i < anss.size(); ++i) {
printf("%d %d\n", anss[i].l, anss[i].r);
}
return 0;
}
visual studio 2022在输入样例的时候显示字符数组越界,在加上越界条件判定之后本地可以过,但是oj上10分,如果把越界条件去掉,本地过不了,但是oj上ac了,求大佬帮助