/* 首先考虑从后往前计算lis,显然0的在很多情况下的贡献要大于1 如果遇上0,那么lis++,如果遇上1,那么cnt1++,并且用cnt1更新lis 这样的贪心保证正确,因为从[i,j]这一段的lis必定是前一段0,后一段1这样的构成,当前面多了个0时,显然lis+1 当前面多了个1时当且仅当区间1的个数大于lis,才能让lis+1, 因此当且仅当后缀[i,n]中1的个数大于lis时,对于所有区间[i,j],这个1的作用才等价于1,可以替换 */ #include<bits/stdc++.h> using namespace std; #define N 200005 char s[N],t[N]; int main(){ int n;cin>>s; n=strlen(s); int lis=0,cnt1=0; for(int i=n-1;i>=0;i--){ if(s[i]=='0')lis++; else cnt1++; if(cnt1>lis){ t[i]='0'; lis=cnt1; } else t[i]=s[i]; } cout<<t; }