解题思路:这题条件放的很松,所以每次只要一直找,找到不能找为止就停,然后全都匹配完之后发现1还有剩,那么就是不可行的。所以这题用set是很好做的
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mx = 2e5+10;
int n,m,q,number[mx];
char str[mx];
set <int> st[2];
vector <int> vec[mx];
int main()
{
scanf("%s",str+1);
//top1 = top2 = 0;
int Len = strlen(str+1),num,top;
for(int i=1;i<=Len;i++)
{
num = str[i] - '0';
st[num].insert(i);
}
top = num = 0;
while(st[0].size())
{
vec[top].push_back(*st[0].begin());
st[0].erase(st[0].begin());
int id = 1;
while(1){
auto it = st[id].lower_bound(vec[top].back());
if(it==st[id].end())
{
if(!id) st[1].insert(vec[top].back()),vec[top].erase(--vec[top].end());
break;
}
vec[top].push_back(*it);
st[id].erase(it),id ^= 1;
}
top++;
}
if(st[1].size()) return puts("-1");
printf("%d\n",top);
for(int i=0;i<top;i++){
printf("%d",vec[i].size());
for(int j=0;j<vec[i].size();j++){
printf(" %d",vec[i][j]);
}
puts("");
}
return 0;
}