





'''simple docstring'''


def 						__a(SCREAMING_SNAKE_CASE_	:       str     ):



    '''simple docstring'''





    _lowerCAmelCase						      =   0

    # if input_string is "aba" than new_input_string become "a|b|a"
    _lowerCAmelCase						      =   ""
    _lowerCAmelCase						      =   ""

    # append each character + "|" in new_string for range(0, length-1)
    for i in input_string[: len(SCREAMING_SNAKE_CASE_     ) - 1]:
        new_input_string += i + "|"
    # append last character
    new_input_string += input_string[-1]

    # we will store the starting and ending of previous furthest ending palindromic
    # substring
    _lowerCAmelCase      ,      _lowerCAmelCase						      =   0, 0

    # length[i] shows the length of palindromic substring with center i
    _lowerCAmelCase						      =   [1 for i in range(len(SCREAMING_SNAKE_CASE_     )     )]

    # for each character in new_string find corresponding palindromic string
    _lowerCAmelCase						      =   0
    for j in range(len(SCREAMING_SNAKE_CASE_     )     ):
        _lowerCAmelCase						      =   1 if j > r else min(length[l + r - j] // 2		,							r - j + 1     )
        while (
            j - k >= 0
            and j + k < len(SCREAMING_SNAKE_CASE_     )
            and new_input_string[k + j] == new_input_string[j - k]
        ):
            k += 1

        _lowerCAmelCase						      =   2 * k - 1

        # does this string is ending after the previously explored end (that is r) ?
        # if yes the update the new r to the last index of this
        if j + k - 1 > r:
            _lowerCAmelCase						      =   j - k + 1  # noqa: E741
            _lowerCAmelCase						      =   j + k - 1

        # update max_length and start position
        if max_length < length[j]:
            _lowerCAmelCase						      =   length[j]
            _lowerCAmelCase						      =   j

    # create that string
    _lowerCAmelCase						      =   new_input_string[start - max_length // 2 : start + max_length // 2 + 1]
    for i in s:
        if i != "|":
            output_string += i

    return output_string


if __name__ == "__main__":
       import doctest

       doctest.testmod()





"""simple docstring"""


class lowerCamelCase__   :



    '''simple docstring'''




    def __init__( self    )    ->      Union[str, Any]:
          A				  =		{}




    def UpperCamelCase__		( self    )    ->      None:
          print(self.vertex    )
          for i in self.vertex:
                print(lowerCamelCase_ ,""" -> """ ,""" -> """.join([str(lowerCamelCase_    ) for j in self.vertex[i]]    )    )




    def UpperCamelCase__		( self ,lowerCamelCase_ ,lowerCamelCase_    )    ->      None:
          # check if vertex is already present,
          if from_vertex in self.vertex:
                self.vertex[from_vertex].append(lowerCamelCase_    )
          else:
                # else make a new vertex
                A				  =		[to_vertex]




    def UpperCamelCase__		( self    )    ->      None:
          # visited array for storing already visited nodes
          A				  =		[False] * len(self.vertex    )

          # call the recursive helper function
          for i in range(len(self.vertex    )    ):
                if not visited[i]:
                      self.dfs_recursive(lowerCamelCase_ ,lowerCamelCase_    )




    def UpperCamelCase__		( self ,lowerCamelCase_ ,lowerCamelCase_    )    ->      None:
          # mark start vertex as visited
          A				  =		True

          print(lowerCamelCase_ ,end=""" """    )

          # Recur for all the vertices that are adjacent to this node
          for i in self.vertex:
                if not visited[i]:
                      self.dfs_recursive(lowerCamelCase_ ,lowerCamelCase_    )


if __name__ == "__main__":
  UpperCAmelCase													=Graph()
  g.add_edge(0, 1)
  g.add_edge(0, 2)
  g.add_edge(1, 2)
  g.add_edge(2, 0)
  g.add_edge(2, 3)
  g.add_edge(3, 3)

  g.print_graph()
  print("DFS:")
  g.dfs()

  # OUTPUT:
  # 0  ->  1 -> 2
  # 1  ->  2
  # 2  ->  0 -> 3
  # 3  ->  3
  # DFS:
  #  0 1 2 3




