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();
	}
}