For problem statement at 1000-1999/1900-1999/1910-1919/1913/problemF.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1910-1919/1913/verifierF.go ends with All 100 tests passed can you fix the verifier? package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Buffer(make([]byte, 1024*1024), 1024*1024*10)
if !scanner.Scan() {
return
}
n, _ := strconv.Atoi(scanner.Text())
if !scanner.Scan() {
return
}
s := scanner.Text()
d1 := make([]int, n)
l, r := 0, -1
for i := 0; i < n; i++ {
k := 1
if i <= r {
j := l + r - i
if j >= 0 && d1[j] < r-i+1 {
k = d1[j]
} else {
k = r - i + 1
}
}
for i-k >= 0 && i+k < n && s[i-k] == s[i+k] {
k++
}
d1[i] = k
if i+k-1 > r {
l = i - k + 1
r = i + k - 1
}
}
d2 := make([]int, n)
l, r = 0, -1
for i := 0; i < n; i++ {
k := 0
if i < r {
j := l + r - i - 1
if j >= 0 && d2[j] < r-i {
k = d2[j]
} else {
k = r - i
}
}
for i-k >= 0 && i+k+1 < n && s[i-k] == s[i+k+1] {
k++
}
d2[i] = k
if i+k > r {
l = i - k + 1
r = i + k
}
}
base := int64(0)
for i := 0; i < n; i++ {
base += int64(d1[i])
base += int64(d2[i])
}
D2 := make([]int32, n+5)
addAP1 := func(A, B int) {
if A > B {
return
}
L := int32(B - A + 1)
D2[A] += 1
D2[B+1] -= L + 1
D2[B+2] += L
}
addAP2 := func(A, B int) {
if A > B {
return
}
L := int32(B - A + 1)
D2[A] += L
D2[A+1] -= L + 1
D2[B+2] += 1
}
M := make([]int32, n)
for i := 0; i < n; i++ {
R := d1[i] - 1
addAP1(i-R, i)
addAP2(i+1, i+R)
M[i] += int32(R + 1)
R2 := d2[i]
addAP1(i-R2+1, i)
addAP2(i+1, i+R2)
}
C := make([]int32, n)
curD := int32(0)
curC := int32(0)
for i := 0; i < n; i++ {
curD += D2[i]
curC += curD
C[i] = curC
}
const B1 = 313
const M1 = 1000000007
const B2 = 317
const M2 = 1000000009
P1 := make([]int64, n+1)
P2 := make([]int64, n+1)
H1_1 := make([]int64, n+1)
H1_2 := make([]int64, n+1)
H2_1 := make([]int64, n+1)
H2_2 := make([]int64, n+1)
P1[0] = 1
P2[0] = 1
for i := 1; i <= n; i++ {
P1[i] = (P1[i-1] * B1) % M1
P2[i] = (P2[i-1] * B2) % M2
}
for i := 0; i < n; i++ {
H1_1[i+1] = (H1_1[i]*B1 + int64(s[i])) % M1
H1_2[i+1] = (H1_2[i]*B2 + int64(s[i])) % M2
}
for i := n - 1; i >= 0; i-- {
H2_1[i] = (H2_1[i+1]*B1 + int64(s[i])) % M1
H2_2[i] = (H2_2[i+1]*B2 + int64(s[i])) % M2
}
getH1 := func(l, r int) (int64, int64) {
if l > r {
return 0, 0
}
v1 := (H1_1[r+1] - H1_1[l]*P1[r-l+1]) % M1
if v1 < 0 {
v1 += M1
}
v2 := (H1_2[r+1] - H1_2[l]*P2[r-l+1]) % M2
if v2 < 0 {
v2 += M2
}
return v1, v2
}
getH2 := func(l, r int) (int64, int64) {
if l > r {
return 0, 0
}
v1 := (H2_1[l] - H2_1[r+1]*P1[r-l+1]) % M1
if v1 < 0 {
v1 += M1
}
v2 := (H2_2[l] - H2_2[r+1]*P2[r-l+1]) % M2
if v2 < 0 {
v2 += M2
}
return v1, v2
}
getE := func(L, R_idx int) int {
low := 1
high := L
if n-1-R_idx < high {
high = n - 1 - R_idx
}
ans := 0
for low <= high {
mid := (low + high) / 2
v1_1, v1_2 := getH1(R_idx+1, R_idx+mid)
v2_1, v2_2 := getH2(L-mid, L-1)
if v1_1 == v2_1 && v1_2 == v2_2 {
ans = mid
low = mid + 1
} else {
high = mid - 1
}
}
return ans
}
created := make([]int32, n*26)
for i := 0; i < n; i++ {
R := d1[i] - 1
L := i - R - 1
R_idx := i + R + 1
if L >= 0 && R_idx < n {
E := getE(L, R_idx)
created[L*26+int(s[R_idx]-'a')] += int32(E + 1)
created[R_idx*26+int(s[L]-'a')] += int32(E + 1)
}
R2 := d2[i]
L2 := i - R2
R2_idx := i + 1 + R2
if L2 >= 0 && R2_idx < n {
E := getE(L2, R2_idx)
created[L2*26+int(s[R2_idx]-'a')] += int32(E + 1)
created[R2_idx*26+int(s[L2]-'a')] += int32(E + 1)
}
}
compareStrings := func(i1 int, c1 byte, i2 int, c2 byte, s string) int {
if i1 == i2 {
if c1 < c2 {
return -1
}
if c1 > c2 {
return 1
}
return 0
}
if i1 < i2 {
if c1 < s[i1] {
return -1
}
if c1 > s[i1] {
return 1
}
return 0
} else {
if s[i2] < c2 {
return -1
}
if s[i2] > c2 {
return 1
}
return 0
}
}
maxScore := base
bestI := -1
var bestC byte = 0
for i := 0; i < n; i++ {
for c := byte('a'); c <= byte('z'); c++ {
if c == s[i] {
continue
}
score := base + int64(created[i*26+int(c-'a')]) - int64(C[i]-M[i])
if score > maxScore {
maxScore = score
bestI = i
bestC = c
} else if score == maxScore {
if bestI == -1 {
if c < s[i] {
bestI = i
bestC = c
}
} else {
if compareStrings(i, c, bestI, bestC, s) < 0 {
bestI = i
bestC = c
}
}
}
}
}
fmt.Println(maxScore)
if bestI == -1 {
fmt.Println(s)
} else {
out := []byte(s)
out[bestI] = bestC
fmt.Println(string(out))
}
}