#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
//模拟到头痛的一道题
//有一点细节出错就会全WA,自己思考不够全面细致的问题在这道题暴露的淋漓尽致
//解题思路:
//建堆,然后每次得到差值最小的pop,再从两边找没有出列过的,并且异性的两个
#define abs(x) (x) < 0? -(x) : (x)
inline void read(int &x)
{
register int f = 1;
x = 0;
register char c = getchar();
while(c > '9' || c < '0')
{
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9')
{
x = (x << 3) + (x << 1) + (c ^ 48);
c = getchar();
}
x *= f;
}
const int maxn = 2e5 + 5;
//每个节点就是一对异性
struct node
{
int val, l, r;
// 初始化列表
node(int _val, int _l, int _r)
:val(_val), l(_l), r(_r){}
// 重载运算符
bool operator<(const node &rhs) const
{
// 注意可能有差值相等的对,那么要让编号更小的先出列
if(val != rhs.val)
return val > rhs.val;
else return l > rhs.l;
}
};
int v[maxn];
bool used[maxn];
priority_queue<node> q;
char s[maxn];
int main()
{
int n; read(n);
scanf("%s", s + 1);
// cout << s + 1;
// return 0;
int b(0), g(0);
for(int i = 1;i <= n; i++)
{
// 男女中最少的人数则为对数
if(s[i] == 'B') b++;
else g++;
// 异性则入队筛选
read(v[i]);
if(s[i-1] != s[i] && i != 1)
q.push(node(abs(v[i] - v[i-1]), i-1, i));
}
int cnt;
printf("%d\n", cnt = min(b, g));
while(cnt && !q.empty())
{
int l = q.top().l;
int r = q.top().r;
q.pop();
// 没出列的才可以出列
if(!used[l] && !used[r])
{
printf("%d %d\n", l, r);
used[l] = used[r] = true;
// 往两边寻找没跳过的两个
while(l > 0 && used[l]) l--;
while(r <= n && used[r]) r++;
// 如果有的话且为异性则入队筛选
if(l > 0 && r <= n && s[l] != s[r])
q.push(node(abs(v[l] - v[r]), l, r));
// 每次出列则对数减一
cnt--;
}
}
return 0;
}