Problem
Diwali is the festival of lights. To celebrate it, people decorate their houses with multi-color lights and burst crackers. Everyone loves Diwali, and so does Pari. Pari is very fond of lights, and has transfinite powers, so she buys an infinite number of red and blue light bulbs. As a programmer, she also loves patterns, so she arranges her lights by infinitely repeating a given finite pattern S.
For example, if S is BBRB, the infinite sequence Pari builds would be BBRBBBRBBBRB…
Blue is Pari’s favorite color, so she wants to know the number of blue bulbs between the Ith bulb and Jth bulb, inclusive, in the infinite sequence she built (lights are numbered with consecutive integers starting from 1). In the sequence above, the indices would be numbered as follows:
B B R B B B R B B B R B…
1 2 3 4 5 6 7 8 9 10 11 12
So, for example, there are 4 blue lights between the 4th and 8th positions, but only 2 between the 10th and 12th.
Since the sequence can be very long, she wrote a program to do the count for her. Can you do the same?
Input
The first line of the input gives the number of test cases, T. T test cases follow.
First line of each test case consists of a string S, denoting the initial finite pattern.
Second line of each test case consists of two space separated integers I and J, defined above.
Output
For each test case, output one line containing Case #x: y, where x is the test case number (starting from 1) and y is number of blue bulbs between the Ith bulb and Jth bulb of Pari’s infinite sequence, inclusive.
Limits
1 ≤ T ≤ 100.
1 ≤ length of S ≤ 100.
Each character of S is either uppercase B or uppercase R.
Small dataset
1 ≤ I ≤ J ≤ 10^6.
Large dataset
1 ≤ I ≤ J ≤ 10^18.
分析:
- 先统计一个pattern中出现‘B’的次数。
- (J-I+1)/pattern.size()=pattern在[I,J]之间出现次数
- (J-I+1)%pattern.size()=还有多少个字母没有考虑进来
- 找到pattern中要考虑的起始位置cur,向后考虑(J-I+1)%pattern.size()个字母即可。(注意越界)
代码:Github
#include <iostream>
#include <math.h>
#include <vector>
#include <algorithm>
#include <deque>
#include <string>
#include <stdlib.h>
#include <fstream>
using namespace std;
typedef long long ll;
int T;
int main() {
ifstream fin("A-large-practice.in");
ofstream fout("output");
fin >> T;
for (int k = 1; k <= T; k++) {
string pat = "";
fin >> pat;
ll a, b;
fin >> a >> b;
int size = pat.size();
int num = 0;
for (int i = 0; i < pat.size(); i++) {
if (pat[i] == 'B') num++;
}
ll yu = (b - a + 1) % size;
ll count = (b - a + 1) / size;
ll result = num*count;
ll cur = (a - 1) % size;
for (int i = 1; i <= yu; i++) {
if (pat[cur] == 'B') result++;
cur = (cur + 1) % size;
}
fout << "Case #" << k << ": " << result << endl;
}
}
本文介绍了一种算法,用于计算无限重复模式中特定位置间的蓝色灯泡数量。通过统计基本模式中的蓝色灯泡数量,并结合数学计算确定区间内完整的模式重复次数及剩余部分,高效解决了问题。
342

被折叠的 条评论
为什么被折叠?



