#include <bits/stdc++.h>
using namespace std;
const int MAX = 250 * 1024 * 1024 / 2;
short B[MAX], H[1000], I[502], N[1001], S[1000];
int m, P[501];
bool szukaj(int a, int b) {
if (b - a < m) {
return false;
}
for (int i = a, j = 0; i < b; ++i) {
while (j > -1 && S[j] != B[i]) {
j = N[j];
}
++j;
if (j == m) {
return true;
}
}
return false;
}
int main() {
int a, a2, b, b2, c, n, p;
scanf("%d %d", &n, &m);
a = 0;
for (int i = 1; i <= n; ++i) {
I[i] = a;
scanf("%d", &b);
while (b--) {
scanf("%hd", H + a);
++a;
}
}
I[n + 1] = a;
for (int i = 1; i <= n; ++i) {
for (int j = I[i]; j < I[i + 1]; ++j) {
P[i] += I[H[j] + 1] - I[H[j]];
}
}
for (int i = 0; i < m; ++i) {
scanf("%hd", S + i);
}
N[0] = a = -1;
for (int i = 1; i <= m; ++i) {
while (a > -1 && S[a] != S[i - 1]) {
a = N[a];
}
++a;
if (i == m || S[i] != S[a]) {
N[i] = a;
} else {
N[i] = N[a];
}
}
B[0] = n = 1;
a = 0;
b = 1;
p = I[2] - I[1];
while (true) {
if (szukaj(a, b)) {
printf("%d\n", n);
return 0;
}
if (b - a + p > MAX) {
puts("-1");
return 0;
}
if (a == 0) {
a2 = b2 = MAX - p;
} else {
a2 = b2 = 0;
}
p = 0;
for (int i = a; i < b; ++i) {
c = I[B[i] + 1] - I[B[i]];
memcpy(B + b2, H + I[B[i]], c * sizeof(short));
b2 += c;
p += P[B[i]];
}
a = a2;
b = b2;
++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 | #include <bits/stdc++.h> using namespace std; const int MAX = 250 * 1024 * 1024 / 2; short B[MAX], H[1000], I[502], N[1001], S[1000]; int m, P[501]; bool szukaj(int a, int b) { if (b - a < m) { return false; } for (int i = a, j = 0; i < b; ++i) { while (j > -1 && S[j] != B[i]) { j = N[j]; } ++j; if (j == m) { return true; } } return false; } int main() { int a, a2, b, b2, c, n, p; scanf("%d %d", &n, &m); a = 0; for (int i = 1; i <= n; ++i) { I[i] = a; scanf("%d", &b); while (b--) { scanf("%hd", H + a); ++a; } } I[n + 1] = a; for (int i = 1; i <= n; ++i) { for (int j = I[i]; j < I[i + 1]; ++j) { P[i] += I[H[j] + 1] - I[H[j]]; } } for (int i = 0; i < m; ++i) { scanf("%hd", S + i); } N[0] = a = -1; for (int i = 1; i <= m; ++i) { while (a > -1 && S[a] != S[i - 1]) { a = N[a]; } ++a; if (i == m || S[i] != S[a]) { N[i] = a; } else { N[i] = N[a]; } } B[0] = n = 1; a = 0; b = 1; p = I[2] - I[1]; while (true) { if (szukaj(a, b)) { printf("%d\n", n); return 0; } if (b - a + p > MAX) { puts("-1"); return 0; } if (a == 0) { a2 = b2 = MAX - p; } else { a2 = b2 = 0; } p = 0; for (int i = a; i < b; ++i) { c = I[B[i] + 1] - I[B[i]]; memcpy(B + b2, H + I[B[i]], c * sizeof(short)); b2 += c; p += P[B[i]]; } a = a2; b = b2; ++n; } return 0; } |
English