#include <stdio.h>
#include <stdlib.h>

int comfunc(const void* a, const void* b)
{
    return (*(int*)b - *(int*)a);  // 降序排列
}

int main() {
    int row, column, cost;
    scanf("%d %d %d", &row, &column, &cost);
    
    char map[1001][1001] = {0};
    int segments[1000010] = {0};  // 存储所有连续白色段的长度
    int index = 0;
    
    // 读取矩阵
    for (int i = 0; i < row; i++)
    {
        scanf("%s", map[i]);
    }
    
    // 遍历每一列,找出所有连续白色段
    for (int j = 0; j < column; j++)
    {
        int pos = 0;
        while(pos < row)
        {
            // 跳过黑色格子
            while(pos < row && map[pos][j] == '*') {
                pos++;
            }
            
            // 统计连续白色段长度
            int count = 0;
            while(pos < row && map[pos][j] == 'o') {
                count++;
                pos++;
            }
            
            // 记录2个及以上的白色段
            if (count > 1) {
                segments[index++] = count;
            }
        }
    }
    
    // 按长度降序排序(长的段优先,因为性价比更高)
    qsort(segments, index, sizeof(segments[0]), comfunc);
    
    int score = 0;
    int remaining = cost;
    
    // 贪心选择:优先选长的段
    for (int i = 0; i < index; i++)
    {
        if (remaining >= segments[i]) { // 可以完整染这个段      
            remaining -= segments[i];
            score += segments[i] - 1;  // 段内得分为长度-1
        } else {
            // 只能染部分,但要注意:染部分可能无法获得完整得分
            // 为了简化,我们假设剩余名额可以来自一个段的开头部分
            if (remaining > 1) {
                score += remaining - 1;
            }
            break;
        }
    }
    
    printf("%d", score);
    return 0;
}