//Michal Wos MIM UW #include <climits> #include <cstdlib> #include <iostream> #include <stdio.h> #include <vector> #include <algorithm> #include <set> #include <map> #include <cmath> #include <string> #include <string.h> #include <cstdint> #define pii pair<int,int> #define vi vector<int> #define f first #define s second #define x first #define y second #define Size(x) ((int)(x).size()) #define debon 1 #define deb(burak) if(debon) {cerr<<"DEB-> "<<#burak<<": "<<burak<<endl;} #define debv(burak) if(debon) {cerr<<"DEB-> "<<#burak<<": \t"; for(unsigned int zyx=0;zyx<burak.size();zyx++) cerr<<burak[zyx]<<" "; cerr<<endl;} #define debt(burak,SIzE) if(debon) {cerr<<"DEB-> "<<#burak<<": \t"; for(unsigned int zyx=0;zyx<SIzE;zyx++) cerr<<burak[zyx]<<" "; cerr<<endl;} #define debend if(debon) {cerr<<"_____________________"<<endl;} #define memcheck if(debon) {FILE *fp = fopen("/proc/self/status","r");while( !feof(fp) ) putchar(fgetc(fp));} using namespace std; typedef long long LL; typedef unsigned long long ULL; ULL it_counter = 0; vector<uint_fast16_t> T(2000, -1); void preKMP(vector<uint_fast16_t> &K) { for(int i = 1; i <= K.size(); i++) { int pos = T[i - 1]; while(pos != -1 && K[pos] != K[i - 1]) pos = T[pos]; T[i] = pos + 1; } } // pattern, string auto KMP(vector<uint_fast16_t> &K, vector<uint_fast16_t> &S) { int sp = 0; int kp = 0; while(sp < S.size()) { while(kp != -1 && (kp == K.size() || K[kp] != S[sp])) kp = T[kp]; kp++; sp++; if(kp == K.size()) return true; } return false; } int main() { int m,n,l,a; scanf("%d%d", &n, &m); vector<uint_fast16_t> seq[n+1]; for (int i = 1; i <= n; i++) { scanf("%d", &l); while(l--) { scanf("%d", &a); seq[i].push_back(a); } } vector<uint_fast16_t>pattern; while(m--) { scanf("%d", &a); pattern.push_back(a); } preKMP(pattern); vector<uint_fast16_t>kom,tmp; kom.push_back(1); ULL res = 1; while (true) { if (kom.size() >= pattern.size()) { it_counter += kom.size(); if( KMP(pattern, kom) ){ printf("%llu", res); return 0; } } res++; for(auto a : kom) { for(auto b : seq[a]) { tmp.push_back(b); } } swap(kom,tmp); tmp.clear(); // taki tam czit :) if (it_counter > 7e7 || kom.size() > 5e7 ) { //deb(it_counter); //deb(kom.size()); //memcheck; printf("-1"); return 0; } } return 0; } /* 3 7 2 2 3 3 1 3 3 2 1 2 1 2 1 2 3 3 1 */
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 117 118 119 120 121 122 | //Michal Wos MIM UW #include <climits> #include <cstdlib> #include <iostream> #include <stdio.h> #include <vector> #include <algorithm> #include <set> #include <map> #include <cmath> #include <string> #include <string.h> #include <cstdint> #define pii pair<int,int> #define vi vector<int> #define f first #define s second #define x first #define y second #define Size(x) ((int)(x).size()) #define debon 1 #define deb(burak) if(debon) {cerr<<"DEB-> "<<#burak<<": "<<burak<<endl;} #define debv(burak) if(debon) {cerr<<"DEB-> "<<#burak<<": \t"; for(unsigned int zyx=0;zyx<burak.size();zyx++) cerr<<burak[zyx]<<" "; cerr<<endl;} #define debt(burak,SIzE) if(debon) {cerr<<"DEB-> "<<#burak<<": \t"; for(unsigned int zyx=0;zyx<SIzE;zyx++) cerr<<burak[zyx]<<" "; cerr<<endl;} #define debend if(debon) {cerr<<"_____________________"<<endl;} #define memcheck if(debon) {FILE *fp = fopen("/proc/self/status","r");while( !feof(fp) ) putchar(fgetc(fp));} using namespace std; typedef long long LL; typedef unsigned long long ULL; ULL it_counter = 0; vector<uint_fast16_t> T(2000, -1); void preKMP(vector<uint_fast16_t> &K) { for(int i = 1; i <= K.size(); i++) { int pos = T[i - 1]; while(pos != -1 && K[pos] != K[i - 1]) pos = T[pos]; T[i] = pos + 1; } } // pattern, string auto KMP(vector<uint_fast16_t> &K, vector<uint_fast16_t> &S) { int sp = 0; int kp = 0; while(sp < S.size()) { while(kp != -1 && (kp == K.size() || K[kp] != S[sp])) kp = T[kp]; kp++; sp++; if(kp == K.size()) return true; } return false; } int main() { int m,n,l,a; scanf("%d%d", &n, &m); vector<uint_fast16_t> seq[n+1]; for (int i = 1; i <= n; i++) { scanf("%d", &l); while(l--) { scanf("%d", &a); seq[i].push_back(a); } } vector<uint_fast16_t>pattern; while(m--) { scanf("%d", &a); pattern.push_back(a); } preKMP(pattern); vector<uint_fast16_t>kom,tmp; kom.push_back(1); ULL res = 1; while (true) { if (kom.size() >= pattern.size()) { it_counter += kom.size(); if( KMP(pattern, kom) ){ printf("%llu", res); return 0; } } res++; for(auto a : kom) { for(auto b : seq[a]) { tmp.push_back(b); } } swap(kom,tmp); tmp.clear(); // taki tam czit :) if (it_counter > 7e7 || kom.size() > 5e7 ) { //deb(it_counter); //deb(kom.size()); //memcheck; printf("-1"); return 0; } } return 0; } /* 3 7 2 2 3 3 1 3 3 2 1 2 1 2 1 2 3 3 1 */ |