Round E APAC Test 2017 Problem A. Diwali lightings (C++)

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 
#include 
#include 
#include 
#include 
#include 
#include 
#include  

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;
    }

}

你可能感兴趣的:(算法)