题目解读:给你一个字符串s,求与它等长的字符串t,使t中的0尽可能的多,并且t满足各个区间的LIS(最长非递减子序列)与s相同。
实际上就是看s中的1能不能在t中能不能变成0.
解题思路:
1.显然s中的0不用考虑,在t中保持原样。
2.考虑s中的1。假设i位置出现1。如果位置i后面的所有区间的LIS是以1开头的,那么i位置的1可以变成0。否则不能变成0.
3.既然位置i后面区间的LIS以1开头,那么1的数量一定大于等于0的数量。
4.我们只需要统计位置i之后的1与0的数量。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;cin>>s;
int l=s.size(),cnt=0;
for(int i=l-1;i>=0;i--)
{
if(s[i]=='0')
cnt++;
else if(cnt)
cnt--;
else
s[i]='0';
}
cout<<s<<endl;
return 0;
}