| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 | 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}
 |