#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long int lli;
const lli base = 101;

lli modpow(lli a, lli p){
    lli ret = 1;
    for(int i=63; i>=0; i--){
        ret *= ret;
        if((1LL<<i & p) != 0){
            ret *= a;
        }
    }
    return ret;
}

int conv(char c){
    if('A'<=c && c<='Z') return c-'A';
    if('a'<=c && c<='z') return c-'a'+26;
    if('0'<=c && c<='9') return c-'0'+52;
    if(c=='+') return 62;
    return 63;
}

vector<vector<lli>> inputmat(int h, int w){
    vector<vector<lli>> ret(h+1, vector<lli>(w+6, 0));
    for(int i=0; i<h; i++){
        for(int j=0; j<(w+5)/6; j++){
            char c;
            cin >> c;
            int bits = conv(c);
            for(int k=0; k<6; k++){
                ret[i+1][6*j+k+1] = (bits>>(5-k))&1;
            }
        }
    }
    return ret;
}

void setupsum(vector<vector<lli> > &v){
    int h = v.size();
    int w = v[0].size();
    for(int i=0; i<h; i++){
        for(int j=0; j<w-1; j++){
            v[i][j+1] += v[i][j];
        }
    }
    for(int j=0; j<w; j++){
        for(int i=0; i<h-1; i++){
            v[i+1][j] += v[i][j];
        }
    }
}

void rev(vector<vector<lli>> &v){
    int p = v.size() -1;
    for(int i=0; i<=p; i++){
        reverse(v[i].begin()+1, v[i].begin()+p+1);
    }
}
void rot(vector<vector<lli>> &v){
    vector<vector<lli> > ret = v;
    int p = v.size() -1;
    for(int i=1; i<=p; i++){
        for(int j=1; j<=p; j++){
            ret[i][j] = v[j][p-i+1];
        }
    }
    v = ret;
}

void printmat(vector<vector<lli>> &v){
    for(auto vi: v){
        for(lli i: vi){
            cout << i;
        }
        cout << endl;
    }
    cout << endl;
}

int main(){
    while(1){
        int w,h,p;
        cin >> w >> h >> p;
        if(w == 0) break;

        //inputを取る.累積和ができるようにしておく
        vector<vector<lli> > mat = inputmat(h, w);
        for(int i=0; i<h; i++){
            lli b = modpow(base, i*w);
            for(int j=0; j<w; j++){
                mat[i+1][j+1] *= b;
                b *= base;
            }
        }
        setupsum(mat);

        //回転反転の8パターンをすべてハッシュ値を取る(改行が合うように)
        vector<vector<lli> > ptn = inputmat(p, p);
        lli hv[8] = {};
        for(int d=0; d<2; d++){
            rev(ptn);
            for(int r=0; r<4; r++){
                rot(ptn);
                for(int i=0; i<p; i++){
                    lli b = modpow(base, i*w);
                    for(int j=0; j<p; j++){
                        hv[4*d +r] += b*ptn[i+1][j+1];
                        b *= base;
                    }
                }
            }
        }

        //ハッシュ値のシフトと部分累積和が一致していればおk
        int ans = 0;
        for(int i=0; i<=h-p; i++){
            lli b = modpow(base, i*w);
            for(int j=0; j<=w-p; j++){
                bool ok = false;
                for(int k=0; k<8; k++){
                    if(hv[k]*b == mat[i][j] +mat[i+p][j+p] -mat[i][j+p] -mat[i+p][j]){
                        ok = true;
                    }
                }
                if(ok){
                    ans++;
                }
                b *= base;
            }
        }
        cout << ans << endl;
    }
    return 0;
}


Measured memory_bytes: 11020