#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define fast std::ios::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL)
#define clr0(a) memset((a), 0, sizeof(a))
#define clr1(a) memset((a), -1, sizeof(a))
#define srtin1 cin.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );
#define strin2 getline(cin, text);
#define ll long long
#define test cout<<"archit\n"
#define debug(x) cout<<x<<" "
#define debug1(x) cout<<x<<"\n"
#define debug2(x,y) cout<<x<<" "<<y<<"\n"
#define debug3(x, y, z) cout<<x<<" "<<y<<" "<<z<<"\n"
#define pb push_back
#define pi pair<int,int>
#define fi first
#define si second
#define mod (ll)1000000007
#define mxn 1000005
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
using namespace std;
using namespace __gnu_pbds;
bool checkPalindrome(int* arr, int s, int e)
{
    if(s > e){
        return true;
    }
    if(arr[s]!=arr[e]){
        return false;
    }
    return checkPalindrome(arr, s+1, e-1);
}
int main()
{
    int n,m,k,s;
    cin>>n>>m>>k>>s;
    vector<string>v(n+1);
    for(int i=0;i<=n;i++){
        getline(cin, v[i]);
    }
    int flag=0;
    for(int i=1;i<=n;i++){
        for(int j=0;j<v[i].length();j+=2){
            if(s<=0){
                cout<<"No";
                exit(0);
            }
            if(v[i][j] == '.'){
                s-=2;
            }
            else if(v[i][j] == '*'){
                s+=5;
            }
            else if(v[i][j] == '#'){
                flag=1;
                break;
            }
            if(j!=(v[i].length()-1))
                s-=1;
            if(s<=0){
                cout<<"No";
                exit(0);
            }
            //debug(s);
        }
        if(flag){
            break;
        }
    }
    (s >= k) ? cout<<"Yes\n"<<s : cout<<"No";
    return 0;
}