← Home
For problem statement at 0-999/600-699/670-679/679/problemC.txt this is a correct solution, but verifier at 0-999/600-699/670-679/679/verifierC.go ends with All 100 tests passed can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n, k int
	fmt.Fscan(reader, &n, &k)

	grid := make([]string, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(reader, &grid[i])
	}

	comp := make([][]int, n)
	for i := 0; i < n; i++ {
		comp[i] = make([]int, n)
	}

	compSize := []int{0}
	idCounter := 1

	q := make([][2]int, 0, n*n)

	for i := 0; i < n; i++ {
		for j := 0; j < n; j++ {
			if grid[i][j] == '.' && comp[i][j] == 0 {
				q = q[:0]
				q = append(q, [2]int{i, j})
				comp[i][j] = idCounter
				size := 0
				for head := 0; head < len(q); head++ {
					r, c := q[head][0], q[head][1]
					size++
					if r > 0 && grid[r-1][c] == '.' && comp[r-1][c] == 0 {
						comp[r-1][c] = idCounter
						q = append(q, [2]int{r - 1, c})
					}
					if r < n-1 && grid[r+1][c] == '.' && comp[r+1][c] == 0 {
						comp[r+1][c] = idCounter
						q = append(q, [2]int{r + 1, c})
					}
					if c > 0 && grid[r][c-1] == '.' && comp[r][c-1] == 0 {
						comp[r][c-1] = idCounter
						q = append(q, [2]int{r, c - 1})
					}
					if c < n-1 && grid[r][c+1] == '.' && comp[r][c+1] == 0 {
						comp[r][c+1] = idCounter
						q = append(q, [2]int{r, c + 1})
					}
				}
				compSize = append(compSize, size)
				idCounter++
			}
		}
	}

	maxAns := 0
	for _, s := range compSize {
		if s > maxAns {
			maxAns = s
		}
	}

	freq := make([]int, idCounter)
	visited := make([]bool, idCounter)
	ids := make([]int, 0, 4*k)

	for i := 0; i <= n-k; i++ {
		for r := i; r < i+k; r++ {
			for c := 0; c < k; c++ {
				if comp[r][c] > 0 {
					freq[comp[r][c]]++
				}
			}
		}

		for j := 0; j <= n-k; j++ {
			if j > 0 {
				for r := i; r < i+k; r++ {
					if comp[r][j-1] > 0 {
						freq[comp[r][j-1]]--
					}
					if comp[r][j+k-1] > 0 {
						freq[comp[r][j+k-1]]++
					}
				}
			}

			ids = ids[:0]
			if i > 0 {
				for c := j; c < j+k; c++ {
					if comp[i-1][c] > 0 {
						ids = append(ids, comp[i-1][c])
					}
				}
			}
			if i+k < n {
				for c := j; c < j+k; c++ {
					if comp[i+k][c] > 0 {
						ids = append(ids, comp[i+k][c])
					}
				}
			}
			if j > 0 {
				for r := i; r < i+k; r++ {
					if comp[r][j-1] > 0 {
						ids = append(ids, comp[r][j-1])
					}
				}
			}
			if j+k < n {
				for r := i; r < i+k; r++ {
					if comp[r][j+k] > 0 {
						ids = append(ids, comp[r][j+k])
					}
				}
			}

			sum := k * k
			for _, id := range ids {
				if !visited[id] {
					visited[id] = true
					sum += compSize[id] - freq[id]
				}
			}
			if sum > maxAns {
				maxAns = sum
			}
			for _, id := range ids {
				visited[id] = false
			}
		}

		for r := i; r < i+k; r++ {
			for c := n - k; c < n; c++ {
				if comp[r][c] > 0 {
					freq[comp[r][c]]--
				}
			}
		}
	}

	fmt.Println(maxAns)
}