






from collections.abc import Callable

import numpy as np







def   SCREAMING_SNAKE_CASE       (				snake_case_      :							Callable  ,						snake_case_      :							float  ,						snake_case_      :							float  ,						snake_case_      :							float  ,						snake_case_      :							float     ):
	snake_case__				:   Union[str, Any]     =						int(np.ceil((x_end - xa) / step_size     )     )
	snake_case__				:   Optional[Any]     =						np.zeros((n + 1,)     )
	snake_case__				:   Any     =						ya
	snake_case__				:   Optional[int]     =						xa

	for k in range(snake_case_     ):
		snake_case__				:   int     =						y[k] + step_size * ode_func(snake_case_  ,						y[k]     )
		snake_case__				:   Union[str, Any]     =						y[k] + (
		    (step_size / 2) * (ode_func(snake_case_  ,						y[k]     ) + ode_func(x + step_size  ,						snake_case_     ))
		)
		x += step_size

	return y


if __name__ == "__main__":
	import doctest

	doctest.testmod()











def   SCREAMING_SNAKE_CASE       (				snake_case_      :							str     ):
	snake_case__				:   Any     =						[0] * len(snake_case_     )

	for i in range(1  ,						len(snake_case_     )     ):
		# use last results for better performance - dynamic programming
		snake_case__				:   Union[str, Any]     =						prefix_result[i - 1]
		while j > 0 and input_string[i] != input_string[j]:
			snake_case__				:   str     =						prefix_result[j - 1]

		if input_string[i] == input_string[j]:
			j += 1
		snake_case__				:   int     =						j

	return prefix_result







def   SCREAMING_SNAKE_CASE       (				snake_case_      :							str     ):
	return max(prefix_function(snake_case_     )     )


if __name__ == "__main__":
	import doctest

	doctest.testmod()



