1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <bits/stdc++.h>
using namespace std;
#define REP(i,a,b) for (int i = (a); i <= (b); ++i)
#define REPD(i,a,b) for (int i = (a); i >= (b); --i)
#define FORI(i,n) REP(i,1,n)
#define FOR(i,n) REP(i,0,int(n)-1)
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define vi vector<int>
#define ll long long
#define SZ(x) int((x).size())
#define DBG(v) cerr << #v << " = " << (v) << endl;
#define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++)
#define fi first
#define se second

const int B = 30;

int n,b,r,dig,N;
char s[222][222];
int robo[222];

struct matrix : vector<vi> {
	matrix () {
		resize(N);
		FOR(i,N) at(i).resize(dig,0);
	}
	vi operator*(vi x) {
		vi res(dig,0);
		FOR(j,dig) {
			// liczymy res[j]
			FOR(k,B) {
				res[j] <<= 1;
				FOR(q,dig) if (at(j*B+k)[q]&x[q]) {
					res[j]++;
					break;
				}
			}
		}
		return res;
	}
	void out() {
		FOR(i,N) {
			FOR(j,dig) {
				REPD(k,B-1,0) {
					if (at(i)[j] & (1<<k)) printf("1");
					else printf("0");
				}
			}
			printf("\n");
		}
	}
};

void outv(vi v) {
	FOR(j,dig) {
		REPD(k,B-1,0) {
			if (v[j] & (1<<k)) printf("1");
			else printf("0");
		}
	}
	printf("\n");
}

vi good;
bool ok(vi v) {
	FOR(i,dig) if (v[i] != (good[i]&v[i])) return false;
	return true;
}

int main () {
	scanf("%d%d%d", &n, &b, &r);
	FOR(i,n) scanf("%s", s[i]);
	FOR(i,r) {
		int a;
		scanf("%d", &a);
		a--;
		robo[a]=true;
	}
	dig = (n+B-1)/B;
	N = dig*B;
	matrix m;
	FOR(i,n) {
		FOR(j,dig) {
			FOR(k,B) {
				m[i][j] <<= 1;
				if (j*B+k<n) {
					if (s[j*B+k][i]=='1') m[i][j]++;
				}
			}
		}
	}
	vi v(dig,0);
	FOR(j,dig) {
		FOR(k,B) {
			v[j] <<= 1;
			if (robo[j*B+k]) v[j]++;
		}
	}
	int L=(1<<B)-1;
	good.resize(dig,0);
	FOR(i,b/B) good[i]=L;
	int st=b/B;
	FOR(i,B) {
		good[st] <<= 1;
		if (i<b%B) good[st]++;
	}
	vi last(dig, L);
	FOR(i,N-n) L -= 1<<i;
	last[dig-1] = L;
	int days=0;
	while (!ok(v)) {
		v=m*v;
		days++;
		if (v==last) {
			printf("-1\n");
			return 0;
		}
	}
	printf("%d\n", days);
	return 0;
}