1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #include<bits/stdc++.h> using namespace std; #define pb push_back #define rep(i,a,b) for(int i=a,i##end=b;i<=i##end;++i) #define drep(i,a,b) for(int i=a,i##end=b;i>=i##end;--i) template <class T> inline void cmin(T &a,const T &b){ ((a>b)&&(a=b)); } template <class T> inline void cmax(T &a,const T &b){ ((a<b)&&(a=b)); } char IO; int rd(){ int s=0; while(!isdigit(IO=getchar())); do s=(s<<1)+(s<<3)+(IO^'0'); while(isdigit(IO=getchar())); return s; }
typedef vector <int> V; const int N=3e5+10,INF=1e9+10;
int n,m,I[N],L; char s[N]; int fir[N],nxt[N],rk[N],len[N],id[N]; V A[N];
struct Affirmation_Of_My_Existence{ int s[N<<2],t[N<<2]; void Down(int p){ rep(v,p<<1,p<<1|1) t[v]+=t[p],s[v]+=t[p]; t[p]=0; } void Upd(int p,int l,int r,int ql,int qr,int x) { if(ql>qr) return; if(ql<=l && r<=qr) { s[p]+=x,t[p]+=x; return; } Down(p); int mid=(l+r)>>1; if(ql<=mid) Upd(p<<1,l,mid,ql,qr,x); if(qr>mid) Upd(p<<1|1,mid+1,r,ql,qr,x); s[p]=max(s[p<<1],s[p<<1|1]); } void Build(int p,int l,int r){ s[p]=len[id[l]]-INF; if(l==r) return; int mid=(l+r)>>1; Build(p<<1,l,mid),Build(p<<1|1,mid+1,r); } void Add(int x,int k){ x=rk[x]; Upd(1,1,m,x,x,INF*k),Upd(1,1,m,x+1,m,k); } void Get(int p,int l,int r,int x,V &R){ if(s[p]<0) return; if(l==r) return R.pb(id[l]); Down(p); int mid=(l+r)>>1; Get(p<<1,l,mid,x,R); if(s[p<<1]!=x) Get(p<<1|1,mid+1,r,x,R); } } T;
int Solve(int L){ int B=T.s[1]; if(B<0) return 1; if(B>L) return 0; V R; T.Get(1,1,m,B,R); int p=*R.rbegin(),l=len[p]; for(int i:R) T.Add(i,-1); if(nxt[p]) T.Add(nxt[p],1); if(Solve(l-1)) { rep(i,l,B) s[i]=1; return B+1; }
if(nxt[p]) T.Add(nxt[p],-1); if(B<L && Solve(l)) { rep(i,l+1,B+1) s[i]=1; return B+2; } for(int i:R) T.Add(i,1); return 0; }
int main(){ rep(i,1,n=rd()) { scanf("%s",s); int l=strlen(s); cmax(L,l); drep(j,l-1,0) if(s[j]=='1') { nxt[++m]=fir[i]; A[len[m]=l-j-1].pb(m); fir[i]=m; } } rk[0]=1e9; int k=m; rep(i,0,L-1) { k-=A[i].size(); sort(A[i].begin(),A[i].end(),[&](int x,int y){ return rk[nxt[x]]<rk[nxt[y]]; }); for(int j:A[i]) id[rk[j]=++k]=j; k-=A[i].size(); } T.Build(1,1,m); rep(i,1,n) T.Add(fir[i],1); memset(s,0,sizeof s); drep(i,Solve(INF)-1,0) putchar(s[i]^48); }
|