#include <cstdio> #include <string> #include <iostream> using namespace std; int n, m, x; string tab_ciag[505], cyferka, tekst, wzorzec, tekst_posredni; long long ile_zlaczen; bool czy_byl; int main() { scanf ("%d %d", &n, &m); for (int i=0; i<n; i++) { scanf ("%d", &x); tab_ciag[i].reserve(x); for (int j=0; j<x; j++) { cin >> cyferka; tab_ciag[i] += cyferka; } } wzorzec.reserve(m); for (int i=0; i<m; i++) { cin >> cyferka; wzorzec += cyferka; } tekst += '1'; long long P[1000005]; long long obecny; while(czy_byl == false) { ile_zlaczen++; for (int i=0; i<tekst.size(); i++) { tekst_posredni += tab_ciag[(tekst[i] % 48) - 1]; } tekst = wzorzec + '#' + tekst_posredni; P[1] = 0; obecny = 0; for (int i=1; i<tekst.size(); i++) { while(obecny > 0 && tekst[obecny] != tekst[i]) { obecny = P[obecny]; } if(tekst[obecny] == tekst[i]) obecny++; P[i+1] = obecny; if(P[i+1] == wzorzec.size()) { printf ("%lld\n", ile_zlaczen + 1); czy_byl = true; break; } } tekst = tekst_posredni; tekst_posredni.clear(); } }
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 | #include <cstdio> #include <string> #include <iostream> using namespace std; int n, m, x; string tab_ciag[505], cyferka, tekst, wzorzec, tekst_posredni; long long ile_zlaczen; bool czy_byl; int main() { scanf ("%d %d", &n, &m); for (int i=0; i<n; i++) { scanf ("%d", &x); tab_ciag[i].reserve(x); for (int j=0; j<x; j++) { cin >> cyferka; tab_ciag[i] += cyferka; } } wzorzec.reserve(m); for (int i=0; i<m; i++) { cin >> cyferka; wzorzec += cyferka; } tekst += '1'; long long P[1000005]; long long obecny; while(czy_byl == false) { ile_zlaczen++; for (int i=0; i<tekst.size(); i++) { tekst_posredni += tab_ciag[(tekst[i] % 48) - 1]; } tekst = wzorzec + '#' + tekst_posredni; P[1] = 0; obecny = 0; for (int i=1; i<tekst.size(); i++) { while(obecny > 0 && tekst[obecny] != tekst[i]) { obecny = P[obecny]; } if(tekst[obecny] == tekst[i]) obecny++; P[i+1] = obecny; if(P[i+1] == wzorzec.size()) { printf ("%lld\n", ile_zlaczen + 1); czy_byl = true; break; } } tekst = tekst_posredni; tekst_posredni.clear(); } } |