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

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值