题意:
分析:异或把式子分成了很多块,我们把每一块先贪心相加,如果每一块多一个异或运算,总和-2,也就是说多任意个异或,减少的值都是2的倍数。我们可以从高到低贪心确认每一位能不能为1,能放就打标记,下次就不放了,最后考虑相异或的1的个数的奇偶情况。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+5;
int t,vis[N];
int main() {
cin>>t;
while(t--){
string s;
cin>>s;
int cnt=1;
memset(vis,0,sizeof(vis));
for(int i=0;i<s.size();i++) {
if(s[i]=='^') {
///贪心构造
for(int j=21;j>0;j--) {
if(cnt>=(1<<j) && !vis[j]) {
vis[j]=1;
cnt-=(1<<j);
}
}
cnt=1;
}
else cnt++;
}
for(int j=21;j>0;j--) {
if(cnt>=(1<<j) && !vis[j]) {
vis[j]=1;
cnt-=(1<<j);
}
}
int ans=0;
for(int i=21;i>0;i--) if(vis[i]) ans+=(1<<i);
///特判最终1的个数
if((s.size()+1-ans)%2) ans++;
printf("%d\n",ans);
}
return 0;
}