#include <cstdio>
#include <vector>
using namespace std;
#define MAX_N 500
#define MAX_M 1000
int n,m;
vector<int> H[MAX_N];
int S[MAX_M+1];
vector<int> P;
int main(){
scanf("%d%d",&n,&m);
for(int a=0;a<n;++a){
int l;
scanf("%d",&l);
H[a].reserve(l);
for(int b=0;b<l;++b){
int q;
scanf("%d",&q);
--q;
H[a].push_back(q);
}
}
for(int a=0;a<m;++a){
scanf("%d",S+a);
--S[a];
}
S[m]=-1;
P.push_back(0);
int i=1;
int t=0;
while(i<=m){
while(t>0 && S[t]!=S[i])t=P[t-1];
if(S[t]==S[i])++t;
P.push_back(t);
++i;
}
vector<int>* V1=new vector<int>;
vector<int>* V2=new vector<int>;
V1->push_back(0);
int ans=1;
while(1){
P.resize(m+1);
i=m+1;
t=P.back();
while(i<=m+V1->size()){
while(t>0 && S[t]!=V1->at(i-m-1))t=P[t-1];
if(S[t]==V1->at(i-m-1))++t;
P.push_back(t);
if(t==m){
printf("%d",ans);
return 0;
}
++i;
}
V2->clear();
for(int x:(*V1)){
for(int y:H[x]){
V2->push_back(y);
}
}
swap(V1,V2);
++ans;
}
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 | #include <cstdio> #include <vector> using namespace std; #define MAX_N 500 #define MAX_M 1000 int n,m; vector<int> H[MAX_N]; int S[MAX_M+1]; vector<int> P; int main(){ scanf("%d%d",&n,&m); for(int a=0;a<n;++a){ int l; scanf("%d",&l); H[a].reserve(l); for(int b=0;b<l;++b){ int q; scanf("%d",&q); --q; H[a].push_back(q); } } for(int a=0;a<m;++a){ scanf("%d",S+a); --S[a]; } S[m]=-1; P.push_back(0); int i=1; int t=0; while(i<=m){ while(t>0 && S[t]!=S[i])t=P[t-1]; if(S[t]==S[i])++t; P.push_back(t); ++i; } vector<int>* V1=new vector<int>; vector<int>* V2=new vector<int>; V1->push_back(0); int ans=1; while(1){ P.resize(m+1); i=m+1; t=P.back(); while(i<=m+V1->size()){ while(t>0 && S[t]!=V1->at(i-m-1))t=P[t-1]; if(S[t]==V1->at(i-m-1))++t; P.push_back(t); if(t==m){ printf("%d",ans); return 0; } ++i; } V2->clear(); for(int x:(*V1)){ for(int y:H[x]){ V2->push_back(y); } } swap(V1,V2); ++ans; } return 0; } |
English