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
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<int> find_paths(string s) {
	vector<int> paths;
	for (int i = 0; i != s.length(); i++)
		if (s[i] == '1')
			paths.push_back(i+1);
	return paths;
}

bool contains(vector<int>& safe_sectors, vector<int>& vec) {
	int i = 0;
	int j = 0;
	while (i != safe_sectors.size() && j != vec.size()) {
		if (safe_sectors[i] == vec[j])
			j++;
		i++;
	}
	if (j == vec.size())
		return true;
	return false;
}

vector<int> 
find_next_safe_sectors(vector<int>& act_safe, vector<vector<int> >& paths) {
	vector<int> ret;
	int len = paths.size();

	for (int i = 0; i != len; i++) {
		if (contains(act_safe, paths[i]))
			ret.push_back(i+1);
	}

	return ret;
}

int main() {
	int n, b, r;
	string s;
	vector<int> init_rob;
	vector<vector<int> > sector_paths;
	vector<vector<int> > safe_sectors;

	cin >> n >> b >> r;
	sector_paths.resize(n);
	for (int i = 0; i != n; i++) {
		cin >> s;
		sector_paths[i] = find_paths(s);
	}

	init_rob.resize(r);
	for (int i = 0; i != r; i++)
		cin >> init_rob[i];
	if (init_rob[r-1] <= b) {
		cout << 0 << endl;
		return 0;
	}

	safe_sectors.resize(n+2);
	for (int i = 0; i != b; i++)
		safe_sectors[0].push_back(i+1);
	for (int i = 1; i != n+2; i++) {
		safe_sectors[i] = find_next_safe_sectors(safe_sectors[i-1], sector_paths);
		if (safe_sectors[i].size() == 0) {
			cout << -1 << endl;
			return 0;
		}
		if (contains(safe_sectors[i], init_rob)) {
			cout << i << endl;
			return 0;
		}
	}

	cout << -1 << endl;
	return 0;
}