暂存;已重新整理思路优化;
题目地址
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s[30];
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%s",s);
int l=strlen(s);
int cnt1=0,cnt0=0;
int flag=0;
//第一堆1和第一堆0的个数
for(int i=0;s[i];i++){
if(s[i]=='1'&&!flag) cnt1++;
else if(s[i]=='0'&&!flag){
cnt0++;
flag=1;
}
else if(s[i]=='0'&&flag){
cnt0++;
}
else if(s[i]=='1'&&flag){
break;
}
}
//参考样例10 110 111
if(cnt1+cnt0==l){
cnt1--;
printf("10");
while(cnt0--) printf("0");
while(cnt1--) printf("1");
puts("");
}
else{
//参考样例 101110 101110000 1011
cnt1=0,cnt0=0,flag=0;//从后往前第一堆0和第一堆1的个数
int i;
for(i=l-1;i>=0;i--){
if(s[i]=='1'){
cnt1++;
flag=1;
}
else if(s[i]=='0'&&!flag){
cnt0++;
}
else if(s[i]=='0'&&flag){
break;
}
}
//打印前面
for(int j=0;j<i;j++) printf("%c",s[j]);
cnt1--;
printf("10");
while(cnt0--) printf("0");
while(cnt1--) printf("1");
puts("");
}
}
return 0;
}
/*
2
101110
1010101
*/