牛客练习赛24---C

        当时写复杂了,发现其实就只有两种颜色,对于每一个颜色计数,然后记录每一种颜色出现的当前次数的时候是什么位置。

然后每一个查询就可以做到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;
}

猜你喜欢

转载自blog.csdn.net/CCCCTong/article/details/81583955