一个01字符串,两个操作:
(1)1 l r区间 [l.r],1变成0,0变成1;
(2)“2g”(g∈{0,1})——计算所有索引i的数字ai的逐位XOR的值,使得si=g。注意,一组空数字的XOR被认为等于0。
例如字符串010000
sum=a1^a3^a4^a5^a6,若将2到4反转,
字符串变为001100
sum1=a1^a2^a5^a6,
s2由1变为0,所以首先我们需要将sum^a2
相同的数异或为0,所以我们需要将 sum^a3^a4,从而消去a3和a4。
综上我们只需要将sum^a2^a3^a4,即异或l到r的区间异或
#include<iostream>
#include<cmath>
using namespace std;
const int N=2e5+10;
int a[N];
int p[N];
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
p[i]=p[i-1]^a[i];
}
string s;
cin>>s;
int sum1=0,sum2=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='0') sum1^=a[i+1];
else sum2^=a[i+1];
}
int q;
cin>>q;
while(q--)
{
int op,l,r;
int g;
cin>>op;
if(op==1)
{
cin>>l>>r;
sum1=sum1^p[r]^p[l-1];
sum2=sum2^p[r]^p[l-1];
}
else
{
cin>>g;
if(g==1) cout<<sum2<<' ';
else cout<<sum1<<' ';
}
}
cout<<endl;
}
return 0;
}