#include <stdio.h> #include <vector> using namespace std; int n, m, l, h; vector <int> rep[500]; int wzorzec[1000]; short int postac1[5000000]; short int postac2[5000000]; int rozmiar1, rozmiar2; int wsk_dod; bool pasuje; bool koniec = false; bool za_dlugi = false; int main() { scanf("%d", &n); scanf("%d", &m); for(int i = 0; i < n; i++) { scanf("%d", &l); for(int j = 0; j < l; j++) { scanf("%d", &h); rep[i].push_back(h-1); } } for(int i = 0; i < m; i++) scanf("%d", &wzorzec[i]); rozmiar1 = 1; if(m == 1 && wzorzec[0] == 1) { printf("1\n"); koniec = true; } else { for(int w = 2; w <= 21; w++) { if(w%2 == 0) { rozmiar2 = 0; for(int u = 0; u < rozmiar1; u++) { for(int r = 0; r < rep[postac1[u]].size(); r++) { postac2[rozmiar2] = rep[postac1[u]].at(r); rozmiar2++; if(rozmiar2 == 5000000) za_dlugi = true; if(za_dlugi) break; } if(za_dlugi) break; } if(za_dlugi) break; for(int u = 0; u <= rozmiar2-m; u++) { pasuje = true; for(int r = 0; r < m; r++) { if(wzorzec[r] != postac2[u+r]+1) { pasuje = false; break; } } if(pasuje) { printf("%d\n", w); koniec = true; } if(koniec) break; } } else { rozmiar1 = 0; for(int u = 0; u < rozmiar2; u++) { for(int r = 0; r < rep[postac2[u]].size(); r++) { postac1[rozmiar1] = rep[postac2[u]].at(r); rozmiar1++; if(rozmiar1 == 5000000) za_dlugi = true; if(za_dlugi) break; } if(za_dlugi) break; } if(za_dlugi) break; for(int u = 0; u <= rozmiar1-m; u++) { pasuje = true; for(int r = 0; r < m; r++) { if(wzorzec[r] != postac1[u+r]+1) { pasuje = false; break; } } if(pasuje) { printf("%d\n", w); koniec = true; } if(koniec) break; } } if(koniec) break; } } if(!koniec) printf("-1\n"); 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 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 | #include <stdio.h> #include <vector> using namespace std; int n, m, l, h; vector <int> rep[500]; int wzorzec[1000]; short int postac1[5000000]; short int postac2[5000000]; int rozmiar1, rozmiar2; int wsk_dod; bool pasuje; bool koniec = false; bool za_dlugi = false; int main() { scanf("%d", &n); scanf("%d", &m); for(int i = 0; i < n; i++) { scanf("%d", &l); for(int j = 0; j < l; j++) { scanf("%d", &h); rep[i].push_back(h-1); } } for(int i = 0; i < m; i++) scanf("%d", &wzorzec[i]); rozmiar1 = 1; if(m == 1 && wzorzec[0] == 1) { printf("1\n"); koniec = true; } else { for(int w = 2; w <= 21; w++) { if(w%2 == 0) { rozmiar2 = 0; for(int u = 0; u < rozmiar1; u++) { for(int r = 0; r < rep[postac1[u]].size(); r++) { postac2[rozmiar2] = rep[postac1[u]].at(r); rozmiar2++; if(rozmiar2 == 5000000) za_dlugi = true; if(za_dlugi) break; } if(za_dlugi) break; } if(za_dlugi) break; for(int u = 0; u <= rozmiar2-m; u++) { pasuje = true; for(int r = 0; r < m; r++) { if(wzorzec[r] != postac2[u+r]+1) { pasuje = false; break; } } if(pasuje) { printf("%d\n", w); koniec = true; } if(koniec) break; } } else { rozmiar1 = 0; for(int u = 0; u < rozmiar2; u++) { for(int r = 0; r < rep[postac2[u]].size(); r++) { postac1[rozmiar1] = rep[postac2[u]].at(r); rozmiar1++; if(rozmiar1 == 5000000) za_dlugi = true; if(za_dlugi) break; } if(za_dlugi) break; } if(za_dlugi) break; for(int u = 0; u <= rozmiar1-m; u++) { pasuje = true; for(int r = 0; r < m; r++) { if(wzorzec[r] != postac1[u+r]+1) { pasuje = false; break; } } if(pasuje) { printf("%d\n", w); koniec = true; } if(koniec) break; } } if(koniec) break; } } if(!koniec) printf("-1\n"); return 0; } |