#include <stdio.h>
#include <vector>
using namespace std;
int main(void){
int n,m,i,j,t,tmp,min=1,lp;
scanf("%d%d",&n,&m);
vector<vector<int> > podzial;
vector<int> komorka;
vector<int> kom_temp;
vector<int> p;
bool sprawdzonapara[n][n];
int wz[m];
podzial.resize(n);
komorka.resize(1);
komorka[0]=1;
p.resize(m+2);
p[0]=0;
for(i=0;i<n;i++) {
scanf("%d",&tmp);
podzial[i].resize(tmp);
for(j=0;j<podzial[i].size();j++) scanf("%d",&podzial[i][j]);
}
for(i=0;i<m;i++) scanf("%d",&wz[i]);
bool odblokowany=true;
while(odblokowany){
odblokowany=false;
for(i=1,t=0;i<p.size();i++){
if(i<m){
while(t>0&&wz[t]!=wz[i]) t=p[t-1];
if(wz[t]==wz[i])p[i]=++t;
else p[i]=0;
}
else if (i==m) p[i]=0;
else{
while(t>0&&wz[t]!=komorka[i-m-1])t=p[t-1];
if(wz[t]==komorka[i-m-1])p[i]=++t;
else p[i]=0;
//printf("tu(%d)",komorka[i-m-1]);
if(i>m+1&&!sprawdzonapara[komorka[i-m-1]][komorka[i-m-2]]){
sprawdzonapara[komorka[i-m-1]][komorka[i-2-m]]=true;
odblokowany=true;
}
if(min==1) odblokowany=true;
if(p[i]==m){ printf("%d",min); return 0;}
}
//printf("%d ",i);
}
for(i=0;i<komorka.size();i++){
kom_temp.insert(kom_temp.end(),podzial[komorka[i]-1].begin(),podzial[komorka[i]-1].end());
}
komorka.clear();
komorka=kom_temp;
kom_temp.clear();
p.resize(m+1+komorka.size());
min++;
//for(i=0;i<komorka.size();i++) printf("%d ",komorka[i]);
//printf("\n");
}
printf("-1");
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 | #include <stdio.h> #include <vector> using namespace std; int main(void){ int n,m,i,j,t,tmp,min=1,lp; scanf("%d%d",&n,&m); vector<vector<int> > podzial; vector<int> komorka; vector<int> kom_temp; vector<int> p; bool sprawdzonapara[n][n]; int wz[m]; podzial.resize(n); komorka.resize(1); komorka[0]=1; p.resize(m+2); p[0]=0; for(i=0;i<n;i++) { scanf("%d",&tmp); podzial[i].resize(tmp); for(j=0;j<podzial[i].size();j++) scanf("%d",&podzial[i][j]); } for(i=0;i<m;i++) scanf("%d",&wz[i]); bool odblokowany=true; while(odblokowany){ odblokowany=false; for(i=1,t=0;i<p.size();i++){ if(i<m){ while(t>0&&wz[t]!=wz[i]) t=p[t-1]; if(wz[t]==wz[i])p[i]=++t; else p[i]=0; } else if (i==m) p[i]=0; else{ while(t>0&&wz[t]!=komorka[i-m-1])t=p[t-1]; if(wz[t]==komorka[i-m-1])p[i]=++t; else p[i]=0; //printf("tu(%d)",komorka[i-m-1]); if(i>m+1&&!sprawdzonapara[komorka[i-m-1]][komorka[i-m-2]]){ sprawdzonapara[komorka[i-m-1]][komorka[i-2-m]]=true; odblokowany=true; } if(min==1) odblokowany=true; if(p[i]==m){ printf("%d",min); return 0;} } //printf("%d ",i); } for(i=0;i<komorka.size();i++){ kom_temp.insert(kom_temp.end(),podzial[komorka[i]-1].begin(),podzial[komorka[i]-1].end()); } komorka.clear(); komorka=kom_temp; kom_temp.clear(); p.resize(m+1+komorka.size()); min++; //for(i=0;i<komorka.size();i++) printf("%d ",komorka[i]); //printf("\n"); } printf("-1"); return 0; } |
English