|  | @@ -0,0 +1,55 @@
 | 
	
		
			
				|  |  | +type pair struct {
 | 
	
		
			
				|  |  | +	_1 int // level
 | 
	
		
			
				|  |  | +	_2 int // length
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func lengthLongestPath(input string) (max int) {
 | 
	
		
			
				|  |  | +	st := make([]pair, 0)
 | 
	
		
			
				|  |  | +	strs := strings.Split(input, "\n")
 | 
	
		
			
				|  |  | +	cnt := 0
 | 
	
		
			
				|  |  | +	for i := range strs {
 | 
	
		
			
				|  |  | +		pre, l := 0, len(st)
 | 
	
		
			
				|  |  | +		if l == 0 {
 | 
	
		
			
				|  |  | +			pre = -1
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +			pre = st[l-1]._1
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		lvnlen, isFile := process(strs[i], pre)
 | 
	
		
			
				|  |  | +		for l != 0 && st[l-1]._1+1 != lvnlen._1 {
 | 
	
		
			
				|  |  | +			cnt -= st[l-1]._2
 | 
	
		
			
				|  |  | +			st = st[:l-1]
 | 
	
		
			
				|  |  | +			l--
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		st = append(st, lvnlen)
 | 
	
		
			
				|  |  | +		cnt += lvnlen._2
 | 
	
		
			
				|  |  | +		if isFile && max < cnt {
 | 
	
		
			
				|  |  | +			max = cnt
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func process(s string, pre int) (lvnlen pair, isFile bool) {
 | 
	
		
			
				|  |  | +	tabs, spaces, l := 0, 0, 0
 | 
	
		
			
				|  |  | +	for _, r := range s {
 | 
	
		
			
				|  |  | +		l++
 | 
	
		
			
				|  |  | +		switch r {
 | 
	
		
			
				|  |  | +		case '\t':
 | 
	
		
			
				|  |  | +			tabs++
 | 
	
		
			
				|  |  | +		case ' ':
 | 
	
		
			
				|  |  | +			spaces++
 | 
	
		
			
				|  |  | +		case '.':
 | 
	
		
			
				|  |  | +			isFile = true
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	if tabs <= pre+1 && pre+1 <= tabs+spaces/4 { // 4 spaces can also be regarded as tabs >:-(
 | 
	
		
			
				|  |  | +		lvnlen._1, lvnlen._2 = pre+1, l-tabs-(pre+1-tabs)*4
 | 
	
		
			
				|  |  | +	} else {
 | 
	
		
			
				|  |  | +		lvnlen._1, lvnlen._2 = tabs, l-tabs
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	if !isFile {
 | 
	
		
			
				|  |  | +		lvnlen._2++
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 |