Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
35900 | LYLAKIOIAKIOI | 2021北京队选拔模拟赛0-B | C++ | 运行超时 | 60 | 1000 MS | 2428 KB | 3444 | 2025-01-08 16:08:04 |
#include<bits/stdc++.h> #define debug puts("SegTreeAKIOI") #define file freopen("modtwo.in","r",stdin),freopen("modtwo.out","w",stdout) #define pbegin int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define pend cout.flush();return 0;} #define ll long long #define ull unsigned long long #define ui unsigned int #define i16 short #define ui16 unsigned short #define ppc __builtin_popcount #define ppcl __builtin_popcountll #define ctz __builtin_ctz #define ctzl __builtin_ctzll #define clz __builtin_clz #define clzl __builtin_clzll #define rep(i,a,b) for(int i=a;i<=b;i++) #define per(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int N=1e5+11,mod=2,LEN=1565; struct Bitset{ ull W[(N>>6)+10]; bool test(int x){ return (W[x>>6]>>(x&63))&1; }void set(int x,bool v){ if(v) W[x>>6]|=1ull<<(x&63); else W[x>>6]&=((-1ull)-(1ull<<(x&63))); }int count(){ int res=0; rep(i,0,LEN){ res+=ppcl(W[i]); }return res; }int countx(int k){ int res=0; rep(i,0,(k>>6)-1){ res+=ppcl(W[i]); }res+=ppcl((ull)(W[k>>6]<<(63-(k&63)))); return res; }Bitset operator&(const Bitset &rh)const{ Bitset res; rep(i,0,LEN) res.W[i]=W[i]&rh.W[i]; return res; }Bitset operator|(const Bitset &rh)const{ Bitset res; rep(i,0,LEN) res.W[i]=W[i]|rh.W[i]; return res; }Bitset operator^(const Bitset &rh)const{ Bitset res; rep(i,0,LEN) res.W[i]=W[i]^rh.W[i]; return res; }void shift(){ bool now=0,lst=0; rep(i,0,LEN){ now=(W[i]>>63)&1; W[i]=(W[i]<<1)|lst; lst=now; } }void print(){ rep(i,0,2){ rep(j,0,63){ cout<<((W[i]>>j)&1); } }cout<<endl; } }wf[23],wrf[23],wg[23],bs; ui f[N],g[N],n; string s; pbegin //file; cin>>s;n=s.length();s='0'+s; f[0]=1,g[0]=1; wf[0].set(0,1); wrf[0].set(0,1); wg[0].set(0,1); bs.set(0,0); int pw=20,val=0; for(int i=1;i<=n;i++){ pw=1,val=i; while(val<n) pw++,val<<=1; bs.shift();bs.set(0,s[i]-'0'); //bs.print(); //wg[0].print(); int now=0; for(int j=0;j<=pw;j++){ now+=(wg[j]&bs).count(); //cout<<now<<' '; int id=now&1;now>>=1; if(id) f[i]|=1<<j; }//cout<<f[i]<<' '; for(int j=0;j<=pw;j++){ wf[j].set(i,(f[i]>>j)&1); wrf[j].shift(); wrf[j].set(0,(f[i]>>j)&1); }int cnt=(i-1)/2;now=0; for(int j=0;j<=pw;j++){ for(int k=0;k<=j;k++){ Bitset x=wf[k]&wrf[j-k]; now+=x.countx(cnt); }int id=now&1;now>>=1; if(id) g[i]|=1<<j; }if(i%2==0) g[i]+=f[i/2]*(f[i/2]+1)/2; for(int j=0;j<=pw;j++){ wg[j].set(i,(g[i]>>j)&1); }//cout<<g[i]<<endl; } /*for(int i=1;i<=n;i++){ for(int j=0;j<=i;j++){ if(s[i-j]=='1') f[i]+=g[j]; } for(int j=0;j<i-j;j++){ g[i]+=f[j]*f[i-j]; } if(i%2==0) g[i]+=f[i/2]*(f[i/2]+1)/2; cout<<f[i]<<' '<<g[i]<<endl; }*/ for(int i=1;i<=n;i++){ cout<<f[i]%2; } pend