Petya 开完了派对,想回家。
我们可以把整个城市抽象成一条直线,开派对的地方在直线的一端,Petya 的家在直线的另一端。
直线上有一些公交车站(用 ‘A’ 表示)和一些电车站(用 ‘B’ 表示)。
Petya 可以支付 a a a 元从一个车站坐到另一个车站,但乘车的路程中路过的必须是公交车站(包括起点不包括终点)。
Petya 可以支付 b b b 元从一个车站坐到另一个车站,但乘车的路程中路过的必须是电车站(包括起点不包括终点)。
但是 Petya 的只有 p p p 元,所以你要帮她算出她至少要步行几站才能到家?
第一行一个整数 t t t ,表示数据的组数。
对于每组数据,有两行:
第一行三个整数,分别为 a a a , b b b 和 p p p ,意义见题目描述。
第二行一个字符串,由’A’和’B’组成,表示这条路上的车站。
对于每组测试数据,输出一行,包含一个整数,即 Petya 至少要步行几站才能到家。
1 ≤ t ≤ 1 0 4 1 \le t \le 10^4 1≤t≤104 ,$1 \le a, b, p \le 10^5 $ ,$ 2 \le |s| \le 10^5 $
After a long party Petya decided to return home, but he turned out to be at the opposite end of the town from his home. There are $ n $ crossroads in the line in the town, and there is either the bus or the tram station at each crossroad.
The crossroads are represented as a string $ s $ of length $ n $ , where $ s_i = \texttt{A} $ , if there is a bus station at $ i $ -th crossroad, and $ s_i = \texttt{B} $ , if there is a tram station at $ i $ -th crossroad. Currently Petya is at the first crossroad (which corresponds to $ s_1 $ ) and his goal is to get to the last crossroad (which corresponds to $ s_n $ ).
If for two crossroads $ i $ and $ j $ for all crossroads $ i, i+1, \ldots, j-1 $ there is a bus station, one can pay $ a $ roubles for the bus ticket, and go from $ i $ -th crossroad to the $ j $ -th crossroad by the bus (it is not necessary to have a bus station at the $ j $ -th crossroad). Formally, paying $ a $ roubles Petya can go from $ i $ to $ j $ if $ s_t = \texttt{A} $ for all $ i \le t < j $ .
If for two crossroads $ i $ and $ j $ for all crossroads $ i, i+1, \ldots, j-1 $ there is a tram station, one can pay $ b $ roubles for the tram ticket, and go from $ i $ -th crossroad to the $ j $ -th crossroad by the tram (it is not necessary to have a tram station at the $ j $ -th crossroad). Formally, paying $ b $ roubles Petya can go from $ i $ to $ j $ if $ s_t = \texttt{B} $ for all $ i \le t < j $ .
For example, if $ s $ =“AABBBAB”, $ a=4 $ and $ b=3 $ then Petya needs:
- buy one bus ticket to get from $ 1 $ to $ 3 $ ,
Thus, in total he needs to spend $ 4+3+4=11 $ roubles. Please note that the type of the stop at the last crossroad (i.e. the character $ s_n $ ) does not affect the final expense.
Now Petya is at the first crossroad, and he wants to get to the $ n $ -th crossroad. After the party he has left with $ p $ roubles. He’s decided to go to some station on foot, and then go to home using only public transport.
Help him to choose the closest crossroad $ i $ to go on foot the first, so he has enough money to get from the $ i $ -th crossroad to the $ n $ -th, using only tram and bus tickets.
Each test contains one or more test cases. The first line contains the number of test cases $ t $ ( $ 1 \le t \le 10^4 $ ).
The first line of each test case consists of three integers $ a, b, p $ ( $ 1 \le a, b, p \le 10^5 $ ) — the cost of bus ticket, the cost of tram ticket and the amount of money Petya has.
The second line of each test case consists of one string $ s $ , where $ s_i = \texttt{A} $ , if there is a bus station at $ i $ -th crossroad, and $ s_i = \texttt{B} $ , if there is a tram station at $ i $ -th crossroad ( $ 2 \le |s| \le 10^5 $ ).
It is guaranteed, that the sum of the length of strings $ s $ by all test cases in one test doesn’t exceed $ 10^5 $ .
For each test case print one number — the minimal index $ i $ of a crossroad Petya should go on foot. The rest of the path (i.e. from $ i $ to $ n $ he should use public transport).
5
2 2 1
BB
1 1 1
AB
3 2 8
AABBBBAABB
5 3 4
BBBBB
2 1 1
ABABAB
2
1
3
1
6
#include
#include
int main(void)
{
int t;
scanf("%d", &t);
while (t--)
{
int a, b, p;
scanf("%d %d %d", &a, &b, &p);
char arr[100001] = { 0 };
scanf("%s", arr);
int n = strlen(arr);
int i=n-1;
for ( ;; )
{
if (arr[i-1] == 'A')
{
if (p >= a&&i>=1)//判断能否跳到上一格,条件为有上一格并且有钱
{
p -= a;
i--;
while (i >= 1&& arr[i ] == arr[i - 1])//判断能否继续往前跳
{
i--;
}
}
else break;//不能继续跳就退出。
}
else
{
if (p >= b&&i>=1)//判断能否跳到上一格,条件为有上一格并且有钱
{
p -= b;
i--;
while (i >= 1 && arr[i] == arr[i - 1])//判断能否继续往前跳
{
i--;
}
}
else
break;
}
}
printf("%d\n", i + 1);
}
return 0;
}
把自己的脑袋当成计算机,将题目中的条件转化为充要
英文题这个翻译是真的慎重。一个看错题意全废