import java.util.*;
import java.io.*;
import java.text.DecimalFormat;
public class Main{
final long mod = (int)998244353, IINF = (long)1e18;
final int MAX = (int)2e5+1, MX = (int)1e7+1, INF = (int)1e9, root = 3;
double eps = 1e-9, PI = 3.141592653589793238462643383279502884197169399375105820974944;
static boolean multipleTC = false, memory = false;
if(memory
)new Thread(null,
new Runnable() {public void run
(){try{new Main
().
run();}catch(Exception e
){e.
printStackTrace();}}},
"1",
1 << 28).
start(); else new Main().run();
}
in = new FastReader();
for(int i = 1, T= (multipleTC)?ni():1; i<= T; i++)solve(i);
out.flush();
out.close();
}
int ans = 0;
int n = ni(), m = ni();
map = new int[m*2];
int[] set = new int[m*2];
ans = 0;
boolean[] st = new boolean[m*2];
for(int i = 0; i< n; i++){
s = n();
for(int j = 0; j< s.length(); j++){
char c = s.charAt(j);
int x = (c<='9')?(c-'0'):(c-'A'+10);
for(int k = 0; k< 4; k++){
st[m+4*j+k] = ((x>>(3-k))&1)==1;
if(st[m+4*j+k])ans++;
set[m+4*j+k] = m+4*j+k;
}
}
for(int j = 0; j< m; j++)if(st[j] && st[j+m])union(set,j,j+m);
for(int j = m+1; j< 2*m; j++)if(st[j] && st[j-1])union(set,j-1,j);
uniq(set);
for(int j = 0; j< m; j++)st[j] = st[j+m];
}
pn(ans);
}
int find(int[] set, int a){
if(set[a]!=a)set[a] = find(set,set[a]);
return set[a];
}
void union(int[] set, int a, int b){
a = find(set,a);b = find(set,b);
if(a==b)return;
set[b] = a;
ans--;
}
int[] map;
void uniq(int[] set){
for(int i = 0; i<map.length; i++)map[i] = -1;
int cur = 0;
for(int i = set.length/2; i< set.length; i++){
if(map[set[i]]==-1)map[set[i]] = cur++;
}
for(int i = 0; i< set.length/2; i++)set[i] = map[set[i+set.length/2]];
}
int[] sort(int[] a){
if(a.length==1)return a;
int mid = a.length/2;
int[] b
= sort
(Arrays.
copyOfRange(a,
0,mid
)), c
= sort
(Arrays.
copyOfRange(a,mid,a.
length)); for(int i = 0, j = 0, k = 0; i< a.length; i++){
if(j<b.length && k<c.length){
if(b[j]<c[k])a[i] = b[j++];
else a[i] = c[k++];
}else if(j<b.length)a[i] = b[j++];
else a[i] = c[k++];
}
return a;
}
long[] sort(long[] a){
if(a.length==1)return a;
int mid = a.length/2;
long[] b
= sort
(Arrays.
copyOfRange(a,
0,mid
)), c
= sort
(Arrays.
copyOfRange(a,mid,a.
length)); for(int i = 0, j = 0, k = 0; i< a.length; i++){
if(j<b.length && k<c.length){
if(b[j]<c[k])a[i] = b[j++];
else a[i] = c[k++];
}else if(j<b.length)a[i] = b[j++];
else a[i] = c[k++];
}
return a;
}
long gcd(long a, long b){return (b==0)?a:gcd(b,a%b);}
int gcd(int a, int b){return (b==0)?a:gcd(b,a%b);}
int bitcount(long n){return (n==0)?0:(1+bitcount(n&(n-1)));}
void p
(Object o
){out.
print(o
);} void pn
(Object o
){out.
println(o
);} void pni
(Object o
){out.
println(o
);out.
flush();} String nln
(){return in.
nextLine();} int ni
(){return Integer.
parseInt(in.
next());} long nl
(){return Long.
parseLong(in.
next());} double nd
(){return Double.
parseDouble(in.
next());}
class FastReader{
public FastReader(){
}
}
while (st == null || !st.hasMoreElements()){
try{
e.printStackTrace();
}
}
return st.nextToken();
}
try{
str = br.readLine();
e.printStackTrace();
}
return str;
}
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5pby4qOyAKaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OwoKcHVibGljIGNsYXNzIE1haW57CiAgICBmaW5hbCBsb25nIG1vZCA9IChpbnQpOTk4MjQ0MzUzLCBJSU5GID0gKGxvbmcpMWUxODsKICAgIGZpbmFsIGludCBNQVggPSAoaW50KTJlNSsxLCBNWCA9IChpbnQpMWU3KzEsIElORiA9IChpbnQpMWU5LCByb290ID0gMzsKICAgIERlY2ltYWxGb3JtYXQgZGYgPSBuZXcgRGVjaW1hbEZvcm1hdCgiMC4wMDAwMDAwMDAwMDAwIik7CiAgICBkb3VibGUgZXBzID0gMWUtOSwgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUwMjg4NDE5NzE2OTM5OTM3NTEwNTgyMDk3NDk0NDsKICAgIHN0YXRpYyBib29sZWFuIG11bHRpcGxlVEMgPSBmYWxzZSwgbWVtb3J5ID0gZmFsc2U7CiAgICBGYXN0UmVhZGVyIGluO1ByaW50V3JpdGVyIG91dDsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb257CiAgICAgICAgaWYobWVtb3J5KW5ldyBUaHJlYWQobnVsbCwgbmV3IFJ1bm5hYmxlKCkge3B1YmxpYyB2b2lkIHJ1bigpe3RyeXtuZXcgTWFpbigpLnJ1bigpO31jYXRjaChFeGNlcHRpb24gZSl7ZS5wcmludFN0YWNrVHJhY2UoKTt9fX0sICIxIiwgMSA8PCAyOCkuc3RhcnQoKTsKICAgICAgICBlbHNlIG5ldyBNYWluKCkucnVuKCk7CiAgICB9CiAgICAKICAgIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbnsKICAgICAgICBpbiA9IG5ldyBGYXN0UmVhZGVyKCk7CiAgICAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQpOwogICAgICAgIGZvcihpbnQgaSA9IDEsIFQ9IChtdWx0aXBsZVRDKT9uaSgpOjE7IGk8PSBUOyBpKyspc29sdmUoaSk7CiAgICAgICAgb3V0LmZsdXNoKCk7CiAgICAgICAgb3V0LmNsb3NlKCk7CiAgICB9CiAgICBpbnQgYW5zID0gMDsKICAgIHZvaWQgc29sdmUoaW50IFRDKSB0aHJvd3MgRXhjZXB0aW9uewogICAgICAgIGludCBuID0gbmkoKSwgbSA9IG5pKCk7CiAgICAgICAgbWFwID0gbmV3IGludFttKjJdOwogICAgICAgIGludFtdIHNldCA9IG5ldyBpbnRbbSoyXTsKICAgICAgICBhbnMgPSAwOwogICAgICAgIFN0cmluZyBzOwogICAgICAgIGJvb2xlYW5bXSBzdCA9IG5ldyBib29sZWFuW20qMl07CiAgICAgICAgZm9yKGludCBpID0gMDsgaTwgbjsgaSsrKXsKICAgICAgICAgICAgcyA9IG4oKTsKICAgICAgICAgICAgZm9yKGludCBqID0gMDsgajwgcy5sZW5ndGgoKTsgaisrKXsKICAgICAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGopOwogICAgICAgICAgICAgICAgaW50IHggPSAoYzw9JzknKT8oYy0nMCcpOihjLSdBJysxMCk7CiAgICAgICAgICAgICAgICBmb3IoaW50IGsgPSAwOyBrPCA0OyBrKyspewogICAgICAgICAgICAgICAgICAgIHN0W20rNCpqK2tdID0gKCh4Pj4oMy1rKSkmMSk9PTE7CiAgICAgICAgICAgICAgICAgICAgaWYoc3RbbSs0Kmora10pYW5zKys7CiAgICAgICAgICAgICAgICAgICAgc2V0W20rNCpqK2tdID0gbSs0KmorazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IoaW50IGogPSAwOyBqPCBtOyBqKyspaWYoc3Rbal0gJiYgc3RbaittXSl1bmlvbihzZXQsaixqK20pOwogICAgICAgICAgICBmb3IoaW50IGogPSBtKzE7IGo8IDIqbTsgaisrKWlmKHN0W2pdICYmIHN0W2otMV0pdW5pb24oc2V0LGotMSxqKTsKICAgICAgICAgICAgdW5pcShzZXQpOwogICAgICAgICAgICBmb3IoaW50IGogPSAwOyBqPCBtOyBqKyspc3Rbal0gPSBzdFtqK21dOwogICAgICAgIH0KICAgICAgICBwbihhbnMpOwogICAgfQogICAgaW50IGZpbmQoaW50W10gc2V0LCBpbnQgYSl7CiAgICAgICAgaWYoc2V0W2FdIT1hKXNldFthXSA9IGZpbmQoc2V0LHNldFthXSk7CiAgICAgICAgcmV0dXJuIHNldFthXTsKICAgIH0KICAgIHZvaWQgdW5pb24oaW50W10gc2V0LCBpbnQgYSwgaW50IGIpewogICAgICAgIGEgPSBmaW5kKHNldCxhKTtiID0gZmluZChzZXQsYik7CiAgICAgICAgaWYoYT09YilyZXR1cm47CiAgICAgICAgc2V0W2JdID0gYTsKICAgICAgICBhbnMtLTsKICAgIH0KICAgIGludFtdIG1hcDsKICAgIHZvaWQgdW5pcShpbnRbXSBzZXQpewogICAgICAgIGZvcihpbnQgaSA9IDA7IGk8bWFwLmxlbmd0aDsgaSsrKW1hcFtpXSA9IC0xOwogICAgICAgIGludCBjdXIgPSAwOwogICAgICAgIGZvcihpbnQgaSA9ICBzZXQubGVuZ3RoLzI7IGk8IHNldC5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIGlmKG1hcFtzZXRbaV1dPT0tMSltYXBbc2V0W2ldXSA9IGN1cisrOwogICAgICAgIH0KICAgICAgICBmb3IoaW50IGkgPSAwOyBpPCBzZXQubGVuZ3RoLzI7IGkrKylzZXRbaV0gPSBtYXBbc2V0W2krc2V0Lmxlbmd0aC8yXV07CiAgICB9CiAgICAKICAgIGludFtdIHNvcnQoaW50W10gYSl7CiAgICAgICAgaWYoYS5sZW5ndGg9PTEpcmV0dXJuIGE7CiAgICAgICAgaW50IG1pZCA9IGEubGVuZ3RoLzI7CiAgICAgICAgaW50W10gYiA9IHNvcnQoQXJyYXlzLmNvcHlPZlJhbmdlKGEsMCxtaWQpKSwgYyA9IHNvcnQoQXJyYXlzLmNvcHlPZlJhbmdlKGEsbWlkLGEubGVuZ3RoKSk7CiAgICAgICAgZm9yKGludCBpID0gMCwgaiA9IDAsIGsgPSAwOyBpPCBhLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgaWYoajxiLmxlbmd0aCAmJiBrPGMubGVuZ3RoKXsKICAgICAgICAgICAgICAgIGlmKGJbal08Y1trXSlhW2ldID0gYltqKytdOwogICAgICAgICAgICAgICAgZWxzZSBhW2ldID0gY1trKytdOwogICAgICAgICAgICB9ZWxzZSBpZihqPGIubGVuZ3RoKWFbaV0gPSBiW2orK107CiAgICAgICAgICAgIGVsc2UgYVtpXSA9IGNbaysrXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGE7CiAgICB9CiAgICAKICAgIGxvbmdbXSBzb3J0KGxvbmdbXSBhKXsKICAgICAgICBpZihhLmxlbmd0aD09MSlyZXR1cm4gYTsKICAgICAgICBpbnQgbWlkID0gYS5sZW5ndGgvMjsKICAgICAgICBsb25nW10gYiA9IHNvcnQoQXJyYXlzLmNvcHlPZlJhbmdlKGEsMCxtaWQpKSwgYyA9IHNvcnQoQXJyYXlzLmNvcHlPZlJhbmdlKGEsbWlkLGEubGVuZ3RoKSk7CiAgICAgICAgZm9yKGludCBpID0gMCwgaiA9IDAsIGsgPSAwOyBpPCBhLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgaWYoajxiLmxlbmd0aCAmJiBrPGMubGVuZ3RoKXsKICAgICAgICAgICAgICAgIGlmKGJbal08Y1trXSlhW2ldID0gYltqKytdOwogICAgICAgICAgICAgICAgZWxzZSBhW2ldID0gY1trKytdOwogICAgICAgICAgICB9ZWxzZSBpZihqPGIubGVuZ3RoKWFbaV0gPSBiW2orK107CiAgICAgICAgICAgIGVsc2UgYVtpXSA9IGNbaysrXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGE7CiAgICB9CgogICAgbG9uZyBnY2QobG9uZyBhLCBsb25nIGIpe3JldHVybiAoYj09MCk/YTpnY2QoYixhJWIpO30KICAgIGludCBnY2QoaW50IGEsIGludCBiKXtyZXR1cm4gKGI9PTApP2E6Z2NkKGIsYSViKTt9CiAgICBpbnQgYml0Y291bnQobG9uZyBuKXtyZXR1cm4gKG49PTApPzA6KDErYml0Y291bnQobiYobi0xKSkpO30KICAgIHZvaWQgcChPYmplY3Qgbyl7b3V0LnByaW50KG8pO30KICAgIHZvaWQgcG4oT2JqZWN0IG8pe291dC5wcmludGxuKG8pO30KICAgIHZvaWQgcG5pKE9iamVjdCBvKXtvdXQucHJpbnRsbihvKTtvdXQuZmx1c2goKTt9CiAgICBTdHJpbmcgbigpe3JldHVybiBpbi5uZXh0KCk7fQogICAgU3RyaW5nIG5sbigpe3JldHVybiBpbi5uZXh0TGluZSgpO30KICAgIGludCBuaSgpe3JldHVybiBJbnRlZ2VyLnBhcnNlSW50KGluLm5leHQoKSk7fQogICAgbG9uZyBubCgpe3JldHVybiBMb25nLnBhcnNlTG9uZyhpbi5uZXh0KCkpO30KICAgIGRvdWJsZSBuZCgpe3JldHVybiBEb3VibGUucGFyc2VEb3VibGUoaW4ubmV4dCgpKTt9CgogICAgY2xhc3MgRmFzdFJlYWRlcnsKICAgICAgICBCdWZmZXJlZFJlYWRlciBicjsKICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3Q7CiAgICAgICAgcHVibGljIEZhc3RSZWFkZXIoKXsKICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbikpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIEZhc3RSZWFkZXIoU3RyaW5nIHMpIHRocm93cyBFeGNlcHRpb257CiAgICAgICAgICAgIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHMpKTsKICAgICAgICB9CgogICAgICAgIFN0cmluZyBuZXh0KCl7CiAgICAgICAgICAgIHdoaWxlIChzdCA9PSBudWxsIHx8ICFzdC5oYXNNb3JlRWxlbWVudHMoKSl7CiAgICAgICAgICAgICAgICB0cnl7CiAgICAgICAgICAgICAgICAgICAgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJyLnJlYWRMaW5lKCkpOwogICAgICAgICAgICAgICAgfWNhdGNoIChJT0V4Y2VwdGlvbiAgZSl7CiAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc3QubmV4dFRva2VuKCk7CiAgICAgICAgfQoKICAgICAgICBTdHJpbmcgbmV4dExpbmUoKXsKICAgICAgICAgICAgU3RyaW5nIHN0ciA9ICIiOwogICAgICAgICAgICB0cnl7ICAgIAogICAgICAgICAgICAgICAgc3RyID0gYnIucmVhZExpbmUoKTsKICAgICAgICAgICAgfWNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgIH0gICAKICAgICAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgICB9CiAgICB9Cn0gICA=