E - TrBBnsformBBtion
Time limit : 2sec / Memory limit : 256MB
Score : 600 points
Problem Statement
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.
Constraints
- 1≤|S|,|T|≤105
- S and T consist of letters
A
andB
. - 1≤q≤105
- 1≤ai≤bi≤|S|
- 1≤ci≤di≤|T|
Input
Input is given from Standard Input in the following format:
S T q a1 b1 c1 d1 … aq bq cq dq
Output
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
.
Sample Input 1
BBBAAAABA BBBBA 4 7 9 2 5 7 9 1 4 1 7 2 5 1 7 2 4
Sample Output 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.
Sample Input 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
Sample Output 2
YES YES YES YES YES YES NO NO NO NO
思路:通过写写画画发现A可以变成AAAA,但A,AA,AAA却不能互变,于是将字符串变成全A串,模3看看是否一样就行了。
# include <bits/stdc++.h>
using namespace std;
const int N = 1e5+3;
char s[N], t[N];
int sp[N], tp[N];
int main()
{
int q, a, b, c,d;
scanf("%s%s%d",s+1,t+1,&q);
for(int i=1; s[i]; ++i)
sp[i] = sp[i-1]+s[i]-'A'+1;
for(int i=1; t[i]; ++i)
tp[i] = tp[i-1]+t[i]-'A'+1;
while(q--)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
if((sp[b]-sp[a-1])%3 == (tp[d]-tp[c-1])%3)
puts("YES");
else
puts("NO");
}
return 0;
}