当时写复杂了,发现其实就只有两种颜色,对于每一个颜色计数,然后记录每一种颜色出现的当前次数的时候是什么位置。
然后每一个查询就可以做到O(1) 查询。
代码如下,可以简化一下,has数组是可以不用开的吧。
#include <bits/stdc++.h>
#define sc1(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define sc4(a,b,c,d) scanf("%d%d%d%d",&a,&b,&c,&d)
using namespace std;
typedef long long LL;
int gcd(int a,int b){if (b == 0) return a; return gcd(b , a%b);}
int lcm(int a, int b){ return a/gcd(a,b)*b;}
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48); ch=getchar();}
return x*f;
}
const int maxn = 1e6 + 10;
char color[maxn];
int has[maxn];
int cntb[maxn],cntr[maxn];
int main(){
int n,m;
sc2(n, m);
scanf("%s",color);
LL len = strlen(color);
for (int i=0; i<len; i++) {
if (color[i] == 'R'){
has['R'-'A']++;
cntr[has['R'-'A']] = i+1;
}else{
has['B'-'A']++;
cntb[has['B'-'A']] = i+1;
}
}
char opt[2];
int q;
for (int i=0; i<m; i++) {
scanf("%s%d",opt,&q);
if (opt[0] == 'R'){
if (cntr[q] != 0)
printf("%d\n",cntr[q]);
else
printf("-1\n");
}else{
if (cntb[q] != 0)
printf("%d\n",cntb[q]);
else
printf("-1\n");
}
}
return 0;
}