牛客网:ph试纸

链接:https://www.nowcoder.com/acm/contest/157/C
来源:牛客网
 

时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

    PH试纸,是一种检测酸碱度的试纸,试纸红色为酸性,蓝色为碱性。

    HtBest有一个PH试纸,试纸被分成了n段,每一段都可以被染色成红色或者蓝色,WHZ在试纸的每一段上都染为一种颜色,HtBest有m个询问,对于每个询问,Ta想知道某种颜色第qi次在什么地方出现。

输入描述:

第一行有两个正整数n,m。
第二行有n个字母(‘R’或’B’),每个第i个字母表示PH试纸第i段的颜色。
接下来m行,第i行有一个大写字母 ci(‘R’或’B’)和一个正整数qi ,用空格隔开,表示查询颜色ci 第qi 次出现的位置。

输出描述:

共m行,第i行一个整数,表示查询结果,若颜色ci出现次数少于qi次,则输出-1,否则输出颜色qi第ci次出现的位置。

示例1

输入

复制

2 2
RB
R 1
B 1

输出

复制

1
2

示例2

输入

复制

2 2
BB
R 1
B 2

输出

复制

-1
2

示例3

输入

复制

3 3
BRB
B 1
B 2
R 1

输出

复制

1
3
2

备注:

对于100%的测试数据:
1 ≤ n, m ≤ 1000000
所有输入数据不超过1000000。
数据量较大,注意使用更快的输入输出方式。

这道题主要是对字符串进行处理,把B和R出现的位置记录在数组中,直接输出就行。

#include<stdio.h>
#include<string.h>
#define N 1000020
char str[N];
int a[N],b[N];
int main()
{
    int m,i,j,s,n;
    char ch;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(str,0,sizeof(str));
        i=1;
        j=1;
        scanf("%s",str);
        for(s=0;s<n;s++)
        {
            if(str[s]=='R')
            {
                a[i]=s+1;
                i++;
            }
            else
            {
                b[j]=s+1;
                j++;
            }
        }
         
        while(m--)
        {
            getchar();
            scanf("%c %d",&ch,&s);
            if(ch=='R'&&a[s]!=0)
            printf("%d
",a[s]);
            else if(ch=='B'&&b[s]!=0)
            printf("%d
",b[s]);
            else
            printf("-1
");
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zyq1758043090/p/10003017.html