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 }

 

posted @ 2016-11-10 15:37  deadshotz  阅读(252)  评论(0编辑  收藏  举报