Problem: Lexicographically smallest permutation of a string that can be reduced to length K by removing K-length prefixes from palindromic substrings of length 2K
Given a binary string str of length N, and an integer K, the task is to find the lexicographically smallest permutation of the string str that can be reduced to length K by removal of every K-length prefix from palindromic substrings of length 2K. If no such permutation exists, print "Not Possible".

Sample Input: str = "0000100001100001”, K = 4
Sample Output: 0001100000011000
Explanation: In the string "0001100000011000", every 2K length substring becomes a palindrome whenever a K-length prefix is removed, until string length reduces to K.

Solution (python):
# Python3 program for the above approach

# Function to count the number of
# zeroes present in the string
def count_zeroes(n, str):
  
  cnt = 0

  # Traverse the string
  for i in range(0, len(str)):
    if (str[i] == '0'):
      cnt += 1
      
  # Return the count
  return cnt

# Function to rearrange the string s.t
# the string can be reduced to a length
# K as per the given rules
def kReducingStringUtil(n, k, str, 
                        no_of_zeroes):
  
  # Distribute the count of 0s and
  # 1s in segment of length 2k
  zeroes_in_2k = (((no_of_zeroes) * 
                   (2 * k)) // n)

  ones_in_2k = 2 * k - zeroes_in_2k

  # Store string that are initially
  # have formed lexicographically
  # smallest 2k length substring
  temp_str = ""

  for i in range(0, (zeroes_in_2k) // 2):
    temp_str += '0'
    
  for i in range(0, (ones_in_2k)):
    temp_str += '1'
  
  for i in range(0, (zeroes_in_2k) // 2):
    temp_str += '0'
    
  # Store the lexicographically
  # smallest string of length n
  # that satisfy the condition
  final_str = ""

  # Insert temp_str into final_str
  # (n/2k) times and add (n%2k)
  # characters of temp_str at end
  for i in range(0, n // (2 * k)):
    final_str += (temp_str)

  for i in range(0, n % (2 * k)):
    final_str += (temp_str[i])
    
  # Return the final string
  return final_str

# Function to reduce the string to
# length K that follows the given
# conditions
def kReducingString(n, k, str):
  
  # If the string contains either
  # 0s or 1s then it always be
  # reduced into a K length string
  no_of_zeroes = count_zeroes(n, str)

  no_of_ones = n - no_of_zeroes

  # If the string contains only 0s
  # 1s then it always reduces to
  # a K length string
  if (no_of_zeroes == 0 or 
      no_of_zeroes == n):
    return str

  # If K = 1
  if (k == 1):
    if (no_of_zeroes == 0 or 
        no_of_zeroes == n):
      return str
    else:
      return "Not Possible"
    
  # Check whether the given string
  # is K reducing string or not
  check = 0

  for i in range((n // k), n, (n // k)):
    if (no_of_zeroes == i or no_of_ones == i):
      check = 1
      break
      
  if (check == 0):
    return "Not Possible"

  # Otherwise recursively find
  # the string
  return kReducingStringUtil(n, k, str, 
                             no_of_zeroes)

# Driver Code
if __name__ == '__main__':
  
  str = "0000100001100001"
  K = 4;
  N = len(str)

  # Function Call
  print(kReducingString(N, K, str))