#include <iostream> #include <vector> #define REP(a, b) for(int a = 0; a < b; a++) #define PB push_back #define SIZE(x) (int)((x).size()) using namespace std; typedef vector<int> VI; int main() { ios_base::sync_with_stdio(0); int n, m, siz; VI start, next; cin >> n >> m; vector< VI > tab; VI sek(m); REP(i, n) { cin >> siz; tab.PB(VI(siz)); REP(j, siz) cin >> tab[i][j]; } REP(i, m) { cin >> sek[i]; } int wyn = 1, sq; start.PB(1); unsigned long long Sstart, Snext; while(1) { wyn++; sq = 0; next.clear(); //sizes Sstart = SIZE(start); //aktualizuje NEXT REP(i, Sstart) REP(j, SIZE(tab[start[i]-1])) next.PB(tab[start[i]-1][j]); //nadaje START wartosci NEXT i sprawdza czy jest wzorzec Snext = SIZE(next); start.resize(Snext); REP(i, Snext) { start[i] = next[i]; if(start[i] == sek[sq]) { sq++; } else if(sq > 0 && sq!=m){ sq = 0; i--; } } if(sq == m) { cout << wyn << endl; break; } if(wyn > (n+2 > m/2 ? n+2 : m/2)) { cout << "-1" << endl; break; } } }
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 | #include <iostream> #include <vector> #define REP(a, b) for(int a = 0; a < b; a++) #define PB push_back #define SIZE(x) (int)((x).size()) using namespace std; typedef vector<int> VI; int main() { ios_base::sync_with_stdio(0); int n, m, siz; VI start, next; cin >> n >> m; vector< VI > tab; VI sek(m); REP(i, n) { cin >> siz; tab.PB(VI(siz)); REP(j, siz) cin >> tab[i][j]; } REP(i, m) { cin >> sek[i]; } int wyn = 1, sq; start.PB(1); unsigned long long Sstart, Snext; while(1) { wyn++; sq = 0; next.clear(); //sizes Sstart = SIZE(start); //aktualizuje NEXT REP(i, Sstart) REP(j, SIZE(tab[start[i]-1])) next.PB(tab[start[i]-1][j]); //nadaje START wartosci NEXT i sprawdza czy jest wzorzec Snext = SIZE(next); start.resize(Snext); REP(i, Snext) { start[i] = next[i]; if(start[i] == sek[sq]) { sq++; } else if(sq > 0 && sq!=m){ sq = 0; i--; } } if(sq == m) { cout << wyn << endl; break; } if(wyn > (n+2 > m/2 ? n+2 : m/2)) { cout << "-1" << endl; break; } } } |