#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; } |