import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 矩阵行数
int m = sc.nextInt(); // 矩阵列数
int k = sc.nextInt(); // 最多可染色的格子数
char[][] matrix = new char[n][m];
// 读取矩阵数据
for (int i = 0; i < n; i++) {
matrix[i] = sc.next().toCharArray();
}
List<Integer> blockLengths = new ArrayList<>();
// 按列遍历,找出所有垂直连续的白色块(长度≥2)
for (int j = 0; j < m; j++) { // 遍历每一列
int currentBlockLength = 0; // 当前连续白色块的长度
for (int i = 0; i < n; i++) { // 遍历列中的每一行
if (matrix[i][j] == 'o') { // 遇到白色格子,增加块长度
currentBlockLength++;
} else { // 遇到非白色格子(黑色)
// 若当前块长度≥2,记录下来(只有≥2的块才能产生得分)
if (currentBlockLength >= 2) {
blockLengths.add(currentBlockLength);
}
currentBlockLength = 0; // 重置块长度
}
}
// 处理列末尾可能存在的连续白色块
if (currentBlockLength >= 2) {
blockLengths.add(currentBlockLength);
}
}
// 按块长度从大到小排序(优先处理长块,能产生更多得分)
Collections.sort(blockLengths, Collections.reverseOrder());
int score = 0;
// 遍历所有块,计算最大得分
for (int length : blockLengths) {
if (k == 0) break; // 染色次数用尽,退出
// 取当前块长度与剩余染色次数的较小值(最多染这么多格子)
int cellsToDye = Math.min(k, length);
// 只有染色数≥2时才能产生得分(连续2个格子产生1分,3个产生2分,以此类推)
if (cellsToDye >= 2) {
score += cellsToDye - 1;
}
k -= cellsToDye; // 消耗染色次数
}
System.out.println(score);
}
}