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 }