class Program {
	 public static func LevDist(_ s1: [UInt8], _ s2: [UInt8]) -> Int32! {
		 let m = s1.count
		 let n = s2.count
		 
		 if m == 0 {
			 return n
		 } else {
			 if n == 0 {
				 return m
			 }
		 }
		 var range = Range(0 ... (n + 1))
		 var v0: Swift.Array<Int64> = range.GetSequence()  
		 var v1 = Swift.Array<Int64>(v0);
		 var i = 0
		 while i < m {
			 v1[0] = i + 1
			 var j = 0
			 while j < n {
				 let substCost = (s1[i] == s2[j] ? v0[j] : v0[j] + 1)
				 let delCost = v0[j + 1] + 1
				 let insCost = v1[j] + 1
				 v1[j + 1] = substCost < delCost ? substCost : delCost
				 if insCost < v1[j + 1] {
					 v1[j + 1] = insCost
				 }
				 j += 1
			 }
			 let temp = v0; v0 = v1; v1 = temp 
			 i += 1
		 }
		 return v0[n]
	 }
 }
var b1 = [UInt8](repeating: 61 as! UInt8, count: 20000)
var b2: [UInt8] = b1
var b3 = Swift.Array<UInt8>(repeating: UInt8(63), count: 20000)
print("Start Distance");
var execTimer: StopWatch! = StopWatch()
execTimer.Start()
print(Program.LevDist(b1, b2))
print(Program.LevDist(b1, b3))
execTimer.Stop()
var execTime: Float64 = execTimer.ElapsedMilliseconds / 1000.0 / 10
print("\(execTime) s")
return 0