#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;
}
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; } |
English