problem
outputstandard output
Alice has a string consisting of characters ‘A’, ‘B’ and ‘C’. Bob can use the following transitions on any substring of our string in any order any number of times:
A BC
B AC
C AB
AAA empty string
Note that a substring is one or more consecutive characters. For given queries, determine whether it is possible to obtain the target string from source.
Input
The first line contains a string S (1 ≤ |S| ≤ 105). The second line contains a string T (1 ≤ |T| ≤ 105), each of these strings consists only of uppercase English letters ‘A’, ‘B’ and ‘C’.
The third line contains the number of queries Q (1 ≤ Q ≤ 105).
The following Q lines describe queries. The i-th of these lines contains four space separated integers ai, bi, ci, di. These represent the i-th query: is it possible to create T[ci..di] from S[ai..bi] by applying the above transitions finite amount of times?
Here, U[x..y] is a substring of U that begins at index x (indexed from 1) and ends at index y. In particular, U[1..|U|] is the whole string U.
It is guaranteed that 1 ≤ a ≤ b ≤ |S| and 1 ≤ c ≤ d ≤ |T|.
Output
Print a string of Q characters, where the i-th character is ‘1’ if the answer to the i-th query is positive, and ‘0’ otherwise.
Example
inputCopy
AABCCBAAB
ABCB
5
1 3 1 2
2 2 2 4
7 9 1 1
3 4 2 3
4 5 1 3
outputCopy
10011
Note
In the first query we can achieve the result, for instance, by using transitions .
The third query asks for changing AAB to A — but in this case we are not able to get rid of the character ‘B’.
analysis
大结论题
可以这么想 , 也同理可以变成
就是说 没有区别可以互换,于是我们把 看成 ,把 看成
接下来要认真考虑各种情况
首先除了末尾连续的 不能消去,字符串中间的任何 我们可以用
凭空变出三个 来消掉消完后设 串中有 个 、 个 , 串中有 个 、 个 ,这些东西用前缀和搞就好了
明显变换过程中, 只会每次 或者不变,所以 且 才有解,否则无解
当 无解,因为 要么不变要么每次 ,不可能变多
当 时,如果 无解,因为想变出两个 必须用
当 时有解,可以把 变成 再变出 来消 ,否则还要
大概就这样了吧……
code
#include<stdio.h>
#define MAXN 100010
#define min(x,y) (x<y)?(x):(y)
using namespace std;
char st1[MAXN],st2[MAXN];
int a1[MAXN],a2[MAXN],b1[MAXN],b2[MAXN];
int n;
int read()
{
int x=0,f=1;
char ch=getchar();
while (ch<'0' || '9'<ch)
{
if (ch=='-')f=-1;
ch=getchar();
}
while ('0'<=ch && ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int main()
{
//freopen("readin.txt","r",stdin);
scanf("%s%s",st1+1,st2+1);
for (int i=1;st1[i];i++)
{
if (st1[i]=='A')a1[i]=a1[i-1]+1;
b1[i]=b1[i-1]+(st1[i]!='A');
}
for (int i=1;st2[i];i++)
{
if (st2[i]=='A')a2[i]=a2[i-1]+1;
b2[i]=b2[i-1]+(st2[i]!='A');
}
n=read();
while (n--)
{
int l1=read(),r1=read(),l2=read(),r2=read(),ok=1;
int s1=b1[r1]-b1[l1-1],s2=b2[r2]-b2[l2-1];
int x1=min(r1-l1+1,a1[r1]),x2=min(r2-l2+1,a2[r2]);
printf("%d",(s1>s2 || (s1+s2)%2==1 || x1<x2 || s1==s2 && x1%3!=x2%3 || s1==0 && x1==x2 && s1!=s2)?0:1);
}
return 0;
}