```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Buffer(make([]byte, 1024*1024), 1024*1024)
scanner.Split(bufio.ScanWords)
if !scanner.Scan() {
return
}
var n int
fmt.Sscanf(scanner.Text(), "%d", &n)
if !scanner.Scan() {
return
}
p1 := scanner.Text()
cnt := make([]int64, 26)
for c := 0; c < 26; c++ {
cnt[c] = int64(maxRun(p1, byte(c+'a')))
}
for i := 1; i < n; i++ {
if !scanner.Scan() {
break
}
t := scanner.Text()
newCnt := make([]int64, 26)
for c := 0; c < 26; c++ {
ch := byte(c + 'a')
allT := isAll(t, ch)
cntT := int64(maxRun(t, ch))
prefT := int64(prefixLen(t, ch))
suffT := int64(suffixLen(t, ch))
if allT {
newCnt[c] = cnt[c]*(int64(len(t))+1) + int64(len(t))
} else {
if cnt[c] > 0 {
val := prefT + 1 + suffT
if cntT > val {
newCnt[c] = cntT
} else {
newCnt[c] = val
}
} else {
newCnt[c] = cntT
}
}
}
cnt = newCnt
}
var maxBeauty int64 = 0
for c := 0; c < 26; c++ {
if cnt[c] > maxBeauty {
maxBeauty = cnt[c]
}
}
fmt.Println(maxBeauty)
}
func maxRun(s string, ch byte) int {
max := 0
curr := 0
for i := 0; i < len(s); i++ {
if s[i] == ch {
curr++
if curr > max {
max = curr
}
} else {
curr = 0
}
}
return max
}
func prefixLen(s string, ch byte) int {
for i := 0; i < len(s); i++ {
if s[i] != ch {
return i
}
}
return len(s)
}
func suffixLen(s string, ch byte) int {
for i := len(s) - 1; i >= 0; i-- {
if s[i] != ch {
return len(s) - 1 - i
}
}
return len(s)
}
func isAll(s string, ch byte) bool {
return prefixLen(s, ch) == len(s)
}
```