


'''simple docstring'''






def       _snake_case     (  A				,					A )		->					bool:
							lowerCAmelCase__      =			len(A ) + 1
							lowerCAmelCase__      =			len(A ) + 1

							# dp is a 2d matrix where dp[i][j] denotes whether prefix string of
							# length i of input_string matches with prefix string of length j of
							# given pattern.
							# "dp" stands for dynamic programming.
							lowerCAmelCase__      =			[[0 for i in range(A )] for j in range(A )]

							# since string of zero length match pattern of zero length
							lowerCAmelCase__      =			1

							# since pattern of zero length will never match with string of non-zero length
							for i in range(1				,					A ):
														lowerCAmelCase__      =			0

							# since string of zero length will match with pattern where there
							# is at least one * alternatively
							for j in range(1				,					A ):
														lowerCAmelCase__      =			dp[0][j - 2] if pattern[j - 1] == '''*''' else 0

							# now using bottom-up approach to find for all remaining lengths
							for i in range(1				,					A ):
														for j in range(1				,					A ):
																					if input_string[i - 1] == pattern[j - 1] or pattern[j - 1] == ".":
																												lowerCAmelCase__      =			dp[i - 1][j - 1]

																					elif pattern[j - 1] == "*":
																												if dp[i][j - 2] == 1:
																																			lowerCAmelCase__      =			1
																												elif pattern[j - 2] in (input_string[i - 1], "."):
																																			lowerCAmelCase__      =			dp[i - 1][j]
																												else:
																																			lowerCAmelCase__      =			0
																					else:
																												lowerCAmelCase__      =			0

							return bool(dp[-1][-1] )


if __name__ == "__main__":
		import doctest

		doctest.testmod()
		# inputing the strings
		# input_string = input("input a string :")
		# pattern = input("input a pattern :")

		__UpperCAmelCase					       =							'''aab'''
		__UpperCAmelCase					       =							'''c*a*b'''

		# using function to check whether given string matches the given pattern
		if match_pattern(input_string, pattern):
				print(f"""{input_string} matches the given pattern {pattern}""")
		else:
				print(f"""{input_string} does not match with the given pattern {pattern}""")



'''simple docstring'''






from __future__ import annotations




class 	a__       :





							'''simple docstring'''






							def __init__(	self      ,					lowerCamelCase_ = 0     ) ->							List[Any]:
														lowerCAmelCase__      =			key







							def 						__SCREAMING_SNAKE_CASE							(	self      ,					lowerCamelCase_      ,					lowerCamelCase_     ) ->							list[str]:
														assert isinstance(lowerCamelCase_      ,					lowerCamelCase_     ) and isinstance(lowerCamelCase_      ,					lowerCamelCase_     )

														lowerCAmelCase__      =			key or self.__key or 1

														# make sure key is an appropriate size
														key %= 2_55

														return [chr(ord(lowerCamelCase_     ) ^ key     ) for ch in content]







							def 						__SCREAMING_SNAKE_CASE							(	self      ,					lowerCamelCase_      ,					lowerCamelCase_     ) ->							list[str]:
														assert isinstance(lowerCamelCase_      ,					lowerCamelCase_     ) and isinstance(lowerCamelCase_      ,					lowerCamelCase_     )

														lowerCAmelCase__      =			key or self.__key or 1

														# make sure key is an appropriate size
														key %= 2_55

														return [chr(ord(lowerCamelCase_     ) ^ key     ) for ch in content]







							def 						__SCREAMING_SNAKE_CASE							(	self      ,					lowerCamelCase_      ,					lowerCamelCase_ = 0     ) ->							str:
														assert isinstance(lowerCamelCase_      ,					lowerCamelCase_     ) and isinstance(lowerCamelCase_      ,					lowerCamelCase_     )

														lowerCAmelCase__      =			key or self.__key or 1

														# make sure key can be any size
														while key > 2_55:
																					key -= 2_55

														# This will be returned
														lowerCAmelCase__      =			''''''

														for ch in content:
																					ans += chr(ord(lowerCamelCase_     ) ^ key     )

														return ans







							def 						__SCREAMING_SNAKE_CASE							(	self      ,					lowerCamelCase_      ,					lowerCamelCase_ = 0     ) ->							str:
														assert isinstance(lowerCamelCase_      ,					lowerCamelCase_     ) and isinstance(lowerCamelCase_      ,					lowerCamelCase_     )

														lowerCAmelCase__      =			key or self.__key or 1

														# make sure key can be any size
														while key > 2_55:
																					key -= 2_55

														# This will be returned
														lowerCAmelCase__      =			''''''

														for ch in content:
																					ans += chr(ord(lowerCamelCase_     ) ^ key     )

														return ans







							def 						__SCREAMING_SNAKE_CASE							(	self      ,					lowerCamelCase_      ,					lowerCamelCase_ = 0     ) ->							bool:
														assert isinstance(lowerCamelCase_      ,					lowerCamelCase_     ) and isinstance(lowerCamelCase_      ,					lowerCamelCase_     )

														try:
																					with open(lowerCamelCase_     ) as fin, open('''encrypt.out'''      ,					'''w+'''     ) as fout:
																												# actual encrypt-process
																												for line in fin:
																																			fout.write(self.encrypt_string(lowerCamelCase_      ,					lowerCamelCase_     )     )

														except OSError:
																					return False

														return True







							def 						__SCREAMING_SNAKE_CASE							(	self      ,					lowerCamelCase_      ,					lowerCamelCase_     ) ->							bool:
														assert isinstance(lowerCamelCase_      ,					lowerCamelCase_     ) and isinstance(lowerCamelCase_      ,					lowerCamelCase_     )

														try:
																					with open(lowerCamelCase_     ) as fin, open('''decrypt.out'''      ,					'''w+'''     ) as fout:
																												# actual encrypt-process
																												for line in fin:
																																			fout.write(self.decrypt_string(lowerCamelCase_      ,					lowerCamelCase_     )     )

														except OSError:
																					return False

														return True


# Tests
# crypt = XORCipher()
# key = 67

# # test encrypt
# print(crypt.encrypt("hallo welt",key))
# # test decrypt
# print(crypt.decrypt(crypt.encrypt("hallo welt",key), key))

# # test encrypt_string
# print(crypt.encrypt_string("hallo welt",key))

# # test decrypt_string
# print(crypt.decrypt_string(crypt.encrypt_string("hallo welt",key),key))

# if (crypt.encrypt_file("test.txt",key)):
#       print("encrypt successful")
# else:
#       print("encrypt unsuccessful")

# if (crypt.decrypt_file("encrypt.out",key)):
#       print("decrypt successful")
# else:
#       print("decrypt unsuccessful")