import sys

# 读取输入(处理大规模输入更高效)
input_lines = sys.stdin.read().splitlines()
n, m, k = map(int, input_lines[0].split())
grid = input_lines[1:n+1]  # 后续n行为矩阵内容

# 存储所有纵向连续'o'的长度(仅收集有效长度,后续用于计算得分)
vertical_continuous_lengths = []

# 遍历每一列(纵向统计,核心:按列遍历更直观统计纵向连续)
for j in range(m):
    current_continuous = 0  # 记录当前列的纵向连续'o'长度
    for i in range(n):
        if grid[i][j] == 'o':
            current_continuous += 1
            # 仅当到达列尾或下一个不是'o'时,收集连续长度(避免重复收集)
            if i == n-1 or grid[i+1][j] != 'o':
                if current_continuous >= 1:  # 至少1个才有效,≥2才有得分价值(后续会自动过滤)
                    vertical_continuous_lengths.append(current_continuous)
                current_continuous = 0
        else:
            # 遇到'*',中断连续,重置计数
                current_continuous = 0

# 核心步骤:降序排序,优先选择最长的连续段(最大化得分效率)
vertical_continuous_lengths.sort(reverse=True)

total_score = 0  # 记录总分
remaining_k = k  # 剩余可染色格子数,避免修改原始k

# 遍历排序后的连续段,累计最大得分
for length in vertical_continuous_lengths:
    if remaining_k <= 1:#1个无法得分
        break  # 无剩余染色名额,终止循环
    if remaining_k>=2:
        total_score+=min(length,remaining_k)-1 #比较剩余涂色数,和o长度,选择小的-1
        remaining_k-=min(length,remaining_k)   #修改剩余涂色数

print(total_score)