#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main() {
// 加速输入输出
ios::sync_with_stdio(false);
cin.tie(0);
int n, m, k;
cin >> n >> m >> k;
vector<string> mp(n);
for (int i = 0; i < n; i++) cin >> mp[i];
vector<int> segments;
// 1. 遍历每一列,提取所有连续的 'o' 段长度
for (int j = 0; j < m; j++) {
int length = 0;
for (int i = 0; i < n; i++) {
if (mp[i][j] == 'o') {
length++;
} else {
if (length > 0) segments.push_back(length);
length = 0;
}
}
if (length > 0) segments.push_back(length);
}
// 2. 贪心:优先填满长度更长的段
// 因为每个段的第一个格子是“启动成本”,不给分。段越长,分数的产出率越高。
sort(segments.rbegin(), segments.rend());
int total_score = 0;
int remaining_k = k;
for (int len : segments) {
if (remaining_k <= 0) break;
// 实际能在这个段染色的数量
int fill = min(remaining_k, len);
// 如果填入的格子数 > 1,得分就是 fill - 1
if (fill > 1) {
total_score += (fill - 1);
}
remaining_k -= fill;
}
cout << total_score << endl;
return 0;
}