• NOIP模拟题——A


    A
    Statement
    给出一个长度不超过100只包含'B'和'R'的字符串,将其无限重复下去。
    比如,BBRB则会形成
    BBRBBBRBBBRB
    现在给出一个区间[l,r]询问该区间内有多少个字符'B'(区间下标从1开始)
    Input
    第一行为一个只包含'B'和'R'的字符串
    第二行为两个整数,表示l和r
    Output
    输出[l,r]区间内字符'B'的数量
    Sample Input
    BBRB
    4 8
    Sample Output
    4
    Limit
    1<=|S|<=100(字符串长度大于等于1,小于等于100)
    1<=i<=r<=1e18

    由于1e18用longlong。将区间分块,中间整个的块先求出来,再加上两边的。

    预处理用到前缀和

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 using namespace std;
     5 const int maxn=105;
     6 char a[maxn];
     7 long long f[maxn];
     8 long long l,r;
     9 long long pos1,pos2,len;
    10 void gg()
    11 {
    12     if(pos1==pos2)
    13     {
    14         long long k1=l%len;
    15         if(k1==0)k1+=len;
    16         long long k2=r%len;
    17         if(r==0)k2+=len;
    18         printf("%I64d",f[k2]-f[k1+1]);
    19     }
    20     else
    21     {
    22         long long po=pos2-pos1-1;
    23         long long ans=po*f[len];
    24         long long k1=l%len;
    25         if(k1==0)k1+=len;
    26         long long k2=r%len;
    27         if(k2==0)k2+=len;
    28         ans+=f[len]-f[k1-1]+f[k2];
    29         printf("%I64d",ans);
    30     }
    31     return ;
    32 }
    33 int main()
    34 {
    35     freopen("a.in","r",stdin);
    36     freopen("a.out","w",stdout);
    37     scanf("%s",a+1);
    38     len=strlen(a+1);
    39     for(int i=1;i<=len;i++)
    40     if(a[i]=='B')f[i]=f[i-1]+1;
    41     else f[i]=f[i-1];
    42     scanf("%I64d%I64d",&l,&r);
    43     pos1=l/len+1;
    44     if(l%len==0)pos1--;
    45     pos2=r/len+1;
    46     if(r%len==0)pos2--;
    47     gg();
    48     return 0;
    49 }
  • 相关阅读:
    基础面试
    三级联动
    数据库分裤分表操作
    缓存的三种方式
    php部分--session的三种用法
    css
    数组
    生成中国地区随机IP
    xml的读取
    React入门
  • 原文地址:https://www.cnblogs.com/937337156Zhang/p/6051182.html
Copyright © 2020-2023  润新知