[字符串]TrBBnsformBBtion
TrBBnsformBBtion
Let us consider the following operations on a string consisting of A
and B
:
- Select a character in a string. If it is
A
, replace it withBB
. If it isB
, replace withAA
. - Select a substring that is equal to either
AAA
orBBB
, and delete it from the string.
For example, if the first operation is performed on ABA
and the first character is selected, the string becomes BBBA
. If the second operation is performed on BBBAAAA
and the fourth through sixth characters are selected, the string becomes BBBA
.
These operations can be performed any number of times, in any order.
You are given two string S and T, and q queries ai,bi,ci,di. For each query, determine whether SaiSai+1…Sbi, a substring of S, can be made into TciTci+1…Tdi, a substring of T.
数据范围
- 1≤|S|,|T|≤105
- S and T consist of letters
A
andB
. - 1≤q≤105
- 1≤ai≤bi≤|S|
- 1≤ci≤di≤|T|
输入
Input is given from Standard Input in the following format:
S T q a1 b1 c1 d1 … aq bq cq dq
输出
Print q lines. The i-th line should contain the response to the i-th query. If SaiSai+1…Sbi can be made into TciTci+1…Tdi, print YES
. Otherwise, print NO
.
输入样例1
BBBAAAABA BBBBA 4 7 9 2 5 7 9 1 4 1 7 2 5 1 7 2 4
输出样例1
YES NO YES NO
The first query asks whether the string ABA
can be made into BBBA
. As explained in the problem statement, it can be done by the first operation.
The second query asks whether ABA
can be made into BBBB
, and the fourth query asks whether BBBAAAA
can be made into BBB
. Neither is possible.
The third query asks whether the string BBBAAAA
can be made into BBBA
. As explained in the problem statement, it can be done by the second operation.
输入样例2
AAAAABBBBAAABBBBAAAA BBBBAAABBBBBBAAAAABB 10 2 15 2 13 2 13 6 16 1 13 2 20 4 20 3 20 1 18 9 19 2 14 1 11 3 20 3 15 6 16 1 17 4 18 8 20 7 20 3 14
输出样例2
YES YES YES YES YES YES NO NO NO NO
代码:
1 # include <bits/stdc++.h> 2 using namespace std; 3 4 const int N = 100010; 5 char s[N], t[N]; 6 int sp[N], tp[N], q, a, b, c, d; 7 int main() { 8 scanf("%s%s%d", s + 1, t + 1, &q); 9 for (int i = 1; s[i]; ++i) { 10 sp[i] = sp[i - 1] + s[i] - 'A' + 1; 11 } 12 for (int i = 1; t[i]; ++i) { 13 tp[i] = tp[i - 1] + t[i] - 'A' + 1; 14 } 15 while(q--) { 16 scanf("%d%d%d%d", &a, &b, &c, &d); 17 if ( (sp[b] - sp[a - 1]) % 3 == (tp[d] - tp[c - 1]) % 3) { 18 printf("YES\n"); 19 } 20 else { 21 printf("NO\n"); 22 } 23 } 24 return 0; 25 }