Problem:
Score : 700 points

Problem Statement

You are given a string s of length n.
Does a tree with n vertices that satisfies the following conditions exist?

The vertices are numbered 1,2,..., n.

The edges are numbered 1,2,..., n-1, and Edge i connects Vertex u_i and v_i.

If the i-th character in s is 1, we can have a connected component of size i by removing one edge from the tree.

If the i-th character in s is 0, we cannot have a connected component of size i by removing any one edge from the tree.

If such a tree exists, construct one such tree.

Constraints

2 \leq n \leq 10^5

s is a string of length n consisting of 0 and 1.

Input

Input is given from Standard Input in the following format:

s

Output

If a tree with n vertices that satisfies the conditions does not exist, print -1.

If a tree with n vertices that satisfies the conditions exist, print n-1 lines.
The i-th line should contain u_i and v_i with a space in between.
If there are multiple trees that satisfy the conditions, any such tree will be accepted.

Sample Input 1

1111

Sample Output 1

-1

It is impossible to have a connected component of size n after removing one edge from a tree with n vertices.

Sample Input 2

1110

Sample Output 2

1 2
2 3
3 4

If Edge 1 or Edge 3 is removed, we will have a connected component of size 1 and another of size 3. If Edge 2 is removed, we will have two connected components, each of size 2.

Sample Input 3

1010

Sample Output 3

1 2
1 3
1 4

Removing any edge will result in a connected component of size 1 and another of size 3.

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>

using namespace std;

int main(){
    string s;
    cin>>s;
    int n=s.length();
    vector<pair<int,int>> ans;
    if(s[n-1]=='1' || s[0]=='0'){
        cout<<"-1\n";
        return 0;
    }
    bool flag=false;
    for(int i=0;i<n/2;i++){
        if(s[i]!=s[n-2-i]){
            flag=true;
            break;
        }
    }
    if(flag){
        cout<<"-1\n";
        return 0;
    }
    int siz=1,hi=1;
    for(int i=1;i<n/2;i++){
        if(siz==i && s[i]=='1'){
            ans.emplace_back(hi,siz+1);
            siz++;
            hi=siz;
        }
        else if(s[i]=='1'){
            while(siz<=i){
                ans.emplace_back(hi,siz+1);
                siz++;
            }
        }
    }
    if(n%2==0 && siz==n/2){
        auto new_ans=ans;
        for(auto i:new_ans){
            ans.emplace_back(n+1-i.first,n+1-i.second);
        }
        ans.emplace_back(siz,n+1-siz);
    }
    else{
        ans.emplace_back(hi,siz+1);
        siz++;
        hi=siz;
        while(siz<n){
            ans.emplace_back(hi,siz+1);
            siz++;
        }
    }
    for(auto i:ans){
        cout<<i.first<<" "<<i.second<<endl;
    }
    return 0;
}