import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); long k = sc.nextLong(); char[][] matrix = new char[n][m]; for (int i = 0; i < n; i++) { matrix[i] = sc.next().toCharArray(); } // 遍历所有连续的垂直空白格段,记录下长度 List<Integer> chainLengths = new ArrayList<>(); // 先遍历每一列,将i j交换循环次序 for(int j = 0; j < m; j++){ int consecutiveWhite = 0; for(int i = 0; i < n; i++){ if(matrix[i][j] == 'o'){ consecutiveWhite++; }else{ if(consecutiveWhite > 0){ chainLengths.add(consecutiveWhite); } consecutiveWhite = 0; } } // 当一整列都是空白的情况 if(consecutiveWhite > 0){ chainLengths.add(consecutiveWhite); } } // 将所有的垂直空白长度按照降序排列 Collections.sort(chainLengths, Collections.reverseOrder()); // 最优的贪心策略非常直接:总是优先在当前可用的、最长的垂直空白链上进行染色。 long score = 0; for(int len : chainLengths){ // 每次记分,都对减去相应的k值 if(k <= 0) break; long toColor = Math.min((long) len, k); k -= toColor; if(toColor > 1){ score += toColor - 1; } } System.out.println(score); } }