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)
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
水题,直接用数学方法搞一下就好了。
注意开LongLong
附代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<string>
#include<iomanip>
#include<ctime>
#include<climits>
#include<cctype>
#include<algorithm>
#define LL long long
#ifdef WIN32
#define AUTO "%I64d"
#else
#define AUTO "%lld"
#endif
using namespace std;
const int maxn = 105;
char A[maxn];
LL len,tot_b,l,r,d,ans,tot,R,L;
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
scanf("%s",A+1);
len = strlen(A+1);
scanf(AUTO,&l);
scanf(AUTO,&r);
for (int i = 1; i <= len; i++)
if(A[i] == 'B') tot_b++;
if(l % len == 0) L = l;
else L = (l / len + 1) * len;
R=(r / len) * len;
d=(R - L) / len;
ans = ans + d * tot_b;
if(l % len == 0) tot = len;
else tot = l % len;
for (int i = 1; i <= L - l + 1; i++)
{
if(A[tot] == 'B') ans++;
tot++;
}
for (int i = 1; R + i <= r; i++)
if(A[i] == 'B') ans++;
cout << ans;
return 0;
}