[二进制]题解 串串串
题面
你有两个长度分别为 的 01 串 。 有 次询问,每次询问给出 ,其中 令 ,你需要求出 的位置个数对 取模的结果
思路
显然 就是 运算的值,答案就是要求
的奇偶性。
注意到由于 本身的操作就有一种自带的奇偶性存在。
为偶数集, 为奇数集。 并且
答案其实就是求
观察到由于 运算可以拆括号,也有交换律。
所以答案转化成
对于 利用一种类似于前缀和的思想,那么对于一段 到 用前缀和思想加减就好了。至于为什么可以这样做,因为答案要求的是奇偶,而加法运算是最显然有奇偶性的一个了。
#include <bits/stdc++.h>
#define debug puts("I ak IOI several times");
#define pb push_back
using namespace std;
template <typename T>inline void read(T& t){
t=0; register char ch=getchar(); register int fflag=1;
while(!('0'<=ch&&ch<='9')){if(ch=='-') fflag=-1;ch=getchar();}
while(('0'<=ch&&ch<='9')){t=((t<<1)+(t<<3))+ch-'0'; ch=getchar();} t*=fflag;
}
template <typename T,typename... Args> inline void read(T& t, Args&... args){
read(t);read(args...);
}
template <typename T>inline void write(T x){
if(x<0) putchar('-'),x=~(x-1); int s[40],top=0;
while(x) s[++top]=x%10,x/=10; if(!top) s[++top]=0;
while(top) putchar(s[top--]+'0');
}
inline bool Get(){
char ch=getchar();
while(!isdigit(ch)) ch=getchar();
return (ch-48);
}
const int MAXN=200086;
int n,m;
bitset<MAXN>a,b,c,d;
int main(){
//freopen("string2.in","r",stdin);
//freopen("string2.out","w",stdout);
read(n,m);
for(int i=1;i<=n;++i) a[i]=Get();
for(int i=1;i<=m;++i) b[i]=Get();
c[1]=d[1]=0;
for(int i=2;i<=n;++i) c[i]=a[i]^c[i-1];
for(int i=2;i<=m;++i) d[i]=b[i]^d[i-1];
/*for(int i=1;i<=n;++i) cout<<c[i];
cout<<endl;
for(int i=1;i<=m;++i) cout<<d[i];*/
int Q; read(Q);
while(Q--){
register int l,r,ll,rr,res=0;
read(l,r,ll,rr);
write((c[r]-c[l-1]+d[rr]-d[ll-1]+2)%2);
putchar('\n');
/*
for(register int i=l,j=ll;i<=r,j<=rr;++i,++j) res=res+(a[i]^b[j]);
write(res%2),puts("");*/
}
return 0;
}
//Welcome back,Chtholly.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】