代码拉取完成,页面将自动刷新
同步操作将从 charlieshu/Algorithms 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#include <iostream>
#include <string>
#include <math.h>
#include <stdio.h>
using namespace std;
int count_one(long n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
void print_bit(long n)
{
int l = sizeof(n)*8;//λ
for(int i=l-1; i>=0; i--)
printf("%d", (n&(1<<i)) != 0);
printf("\n");
}
long getMask(int i, int j){
long result = 0xffffffff<<(i-1)>>(32-j+i-1)<<(32-j);
cout<<"mask("<<i<<","<<j<<"): ";
print_bit(result);
return result;
}
int main(){
string s;
int n,m;
cin>>n>>m;
cin>>s;
int nn = ceil(n/32.0);
long ss[nn];
long temp=0;
cout<<"nn: "<<nn<<endl;
for(int i=0;i<nn*32;i++){
temp = temp<<1;
temp += i<n?(s[i] - '0'):0;
if(i%32==31){
ss[i/32] = temp;
cout<<"temp: "<<temp<<endl;
temp = 0;
}
}
for(int i=0;i<m;i++){
int op,l,r;
cin>>op>>l>>r;
if(!op){
int jn = (r>l)?(r/32-l/32+1):(r/32-l/32+1+nn);
int jb = l/32;
for(int j=0; j<jn; j++){
if(j==0){
long mask = (l/32==n/32)?getMask(l%32, n%32):getMask(l%32, 32);
print_bit(mask);
print_bit(ss[jb+j]);
ss[jb+j] ^= mask;
cout<<"==="<<jb+j<<"===>"<<endl;
print_bit(ss[jb+j]);
}else if(j==jn-1){
long mask = getMask(1, r%32);
print_bit(mask);
print_bit(ss[r/32]);
ss[r/32] ^= mask;
cout<<"==="<<r/32<<"===>"<<endl;
print_bit(ss[r/32]);
}else{
print_bit(jb+j<nn?(jb+j):(jb+j-nn));
ss[jb+j<nn?(jb+j):(jb+j-nn)] ^= (0xffffffff);
cout<<"==="<<(jb+j<nn?(jb+j):(jb+j-nn))<<"===>"<<endl;
print_bit(jb+j<nn?(jb+j):(jb+j-nn));
}
}
}
else{
int num = 0;
int jn = (r>l)?(r/32-l/32+1):(r/32-l/32+1+nn);
int jb = l/32;
for(int j=0; j<jn; j++){
if(j==0){
long mask = (l/32==n/32)?getMask(l%32, n%32):getMask(l%32, 32);
num += count_one(ss[jb+j] & mask);
}else if(j==jn-1){
long mask = getMask(1,r%32);
num += count_one(ss[r/32] & mask);
}else{
num += count_one(ss[jb+j]);
}
}
cout<<num<<endl;
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。