Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
37570 | LYLAKIOI | 【S】T4 | C++ | 通过 | 100 | 33 MS | 3540 KB | 4601 | 2025-04-06 15:51:27 |
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back #define ppc __builtin_popcount typedef long long ll; using namespace std; const int maxn=1e6+10,mod=998244353; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,m;string a; int loc[maxn],b[maxn]; int g(int x){ int M=1; while(M<x)M<<=1; return M; } vector<pi>R; int vis[maxn]; int dp[maxn][20]; pi pre[maxn][20]; int trans(int l,int r){ int res=0; up(i,l,r)res=res*2+a[i]-'0'; return res; } void sol_5(){ up(i,1,n)up(j,0,16)dp[i][j]=0; dp[0][0]=1; up(i,1,n)up(j,0,16)up(l,max(i-5,1),i){ int w=trans(l,i); if(j<w)continue; if(dp[l-1][j-w])dp[i][j]=1,pre[i][j]=m_p(l-1,j-w); } if((!dp[n][8])&&(!dp[n][16])){ printf("-1\n");return; } int p=n,x=(dp[n][8]?8:16); while(p){ auto it=pre[p][x]; R.p_b(m_p(it.p1+1,p)); p=it.p1,x=it.p2; } reverse(R.begin(),R.end()); printf("%d\n",(int)R.size()); for(auto it:R)printf("%d %d\n",it.p1,it.p2); } void sol(int l,int r,int m,int s){ if(s>=m&&s<=m*3/2){ up(i,l,r)vis[i]=0; vector<int>S; up(i,l,r)if(a[i]=='1')S.p_b(i); int sz=S.size(); if(sz&1)s--; int g=sz/2; int b=s-2*g,a=g-b; for(int i=0;i+1<sz;i+=2){ vis[S[i]]=vis[S[i+1]]=1; if(a){ a--; R.p_b(m_p(S[i],S[i])); R.p_b(m_p(S[i+1],S[i+1])); }else { b--; if(S[i]+1==S[i+1])R.p_b(m_p(S[i],S[i+1])); else { R.p_b(m_p(S[i],S[i]+1)); R.p_b(m_p(S[i+1],S[i+1])); vis[S[i]+1]=1; } } } if(sz&1){ vis[S[sz-1]]=1; R.p_b(m_p(S[sz-1],S[sz-1])); } up(i,l,r)if(!vis[i])R.p_b(m_p(i,i)); return; } if(m==4&&s==8){ vector<int>S; up(i,l,r)vis[i]=0; up(i,l,r)if(a[i]=='1')S.p_b(i); R.p_b(m_p(S[0],S[0]+2)); up(i,S[0],S[0]+2)vis[i]=1; if(a[S[0]+1]=='1'&&a[S[0]+2]=='1'){ R.p_b(m_p(S[3],S[3])); vis[S[3]]=1; }else if(a[S[0]+1]=='1'&&a[S[0]+2]=='0'){ R.p_b(m_p(S[2],S[2]));vis[S[2]]=1; R.p_b(m_p(S[3],S[3]));vis[S[3]]=1; }else if(a[S[0]+1]=='0'&&a[S[0]+2]=='1'){ if(S[2]+1==S[3])R.p_b(m_p(S[2],S[3])),vis[S[2]]=vis[S[3]]=1; else R.p_b(m_p(S[2],S[2]+1)),R.p_b(m_p(S[3],S[3])),vis[S[2]]=vis[S[2]+1]=vis[S[3]]=1; }else { if(S[1]+1==S[2])R.p_b(m_p(S[1],S[2])),vis[S[1]]=vis[S[2]]=1; else R.p_b(m_p(S[1],S[1]+1)),R.p_b(m_p(S[2],S[2])),vis[S[1]]=vis[S[1]+1]=vis[S[2]]=1; R.p_b(m_p(S[3],S[3])),vis[S[3]]=1; } up(i,l,r)if(!vis[i])R.p_b(m_p(i,i)); return; } if(m==9){ vector<int>S; up(i,l,r)if(a[i]=='1')S.p_b(i);int p=S[0]; up(i,l,p-1)R.p_b(m_p(i,i)); R.p_b(m_p(p,p+2)); if(a[p+1]=='0'&&a[p+2]=='0')sol(p+3,r,8,12); else if(a[p+1]=='0'&&a[p+2]=='1')sol(p+3,S[6]-1,4,8),sol(S[6],r,3,3); else if(a[p+1]=='1'&&a[p+2]=='0')sol(p+3,r,7,10); else sol(p+3,r,6,9); return; } if(m==10){ vector<int>S; up(i,l,r)if(a[i]=='1')S.p_b(i); sol(l,S[4]-1,4,8),sol(S[4],r,6,8); return; } if(m==11){ vector<int>S; up(i,l,r)if(a[i]=='1')S.p_b(i); sol(l,S[4]-1,4,8),sol(S[4],r,7,8); return; } int p=b[loc[l-1]+m/2]; sol(l,p,m/2,s/2),sol(p+1,r,m-m/2,s/2); } void slv(){ cin>>a;n=a.size();a=" "+a; m=0;up(i,1,n)if(a[i]=='1')m++,b[m]=i,loc[i]=m;else loc[i]=m; if(!m){printf("-1\n");return;} if(m==g(m)){ printf("%d\n",n); up(i,1,n)printf("%d %d\n",i,i); return; }R.clear(); if(m==5){sol_5();return;} sol(1,n,m,g(m)); sort(R.begin(),R.end()); printf("%d\n",(int)R.size()); for(auto it:R)printf("%d %d\n",it.p1,it.p2); }int main(){ //freopen("divide.in","r",stdin),freopen("divide.out","w",stdout); slv(); return 0; }