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
}