Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8. Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
  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
123
124
125
126
127
128
129
130
131
#include <iostream>
using namespace std;

int tab[20000001];
int tab2[20000001];
int replikacja[501][1001];
int m;                           //d�ugo�� �a�cucha wymaganej sekwencji
int sekwencja[1001];             //szukany ci�g znak�w
int il;
unsigned int hashmax;

unsigned int hashuj(int tabela[])
{
   unsigned int hash = 0;
   for (int i=0; i<m; i++)
   {
      hash = hash * (unsigned int)997 + (unsigned int)tabela[i];
   }
   return hash;
}

void policzhashmax()
{
   hashmax = 1;
   for (int i=1; i<m; i++)
   {
      hashmax = hashmax * (unsigned int)997;
   }
}

unsigned int hashnast(unsigned int hash, unsigned int rem, unsigned int add)
{
   return (hash - rem * hashmax)*(unsigned int)997 + add;
}

void eksplozja(int zrodlo[], int docelowe[], int el)
{
   int b=0;
   for (int i=0; i<el; i++)
   {
      int a = zrodlo[i]-1;                           //indeks danej kom�rki
      il += (replikacja[a][0] - 1);
      if (il>20000000)
      {
         return;
      }
      for (int j=1; j<=replikacja[a][0]; j++)
      {
         docelowe[b++] = replikacja[a][j];
      }
   }
}

bool porownaj(int tabela[])
{
   for (int i=0; i<m; i++)   
   {
      if (tabela[i]!=sekwencja[i])  
         return false;
   }
   return true;
}

int main()
{
	ios_base::sync_with_stdio(0);

//Wczytywanie
   int n;                           //ilo�� typ�w kom�rek

   cin>>n;
   cin>>m;
   
   for (int i=0; i<n; i++)
   {
        cin>>replikacja[i][0];
        for (int j=1; j<=replikacja[i][0]; j++)
        {
            cin>>replikacja[i][j];
        }
   }   
   
   for (int i=0; i<m; i++)
   {
      cin>>sekwencja[i];
   }
   
   policzhashmax();
   unsigned int hs = hashuj(sekwencja);

//Sprawdzanie danych
   int wynik=1;
   il=1;
   tab[0]=1;
   
   int *pierwsza = tab;
   int *druga = tab2;
   int *tmp;
   
   for (int i=0; i<il; i++)
   {     
      if (il>=m)
      {
         unsigned int hash = hashuj(pierwsza);
         for (int j=0; j<=il-m; j++)
         {
            if (hs == hash)
            {
               if (porownaj(pierwsza+j))
               {
                  cout<<wynik;
                  return 0;
               }
               
            }
            hash = hashnast(hash, pierwsza[j], pierwsza[m+j]);
         }
      }
      
      eksplozja(pierwsza, druga, il);
      if (il>40000*m)
      {
         cout<<-1;
         return 0;
      }
      wynik++;
      tmp = druga;
      druga = pierwsza;
      pierwsza = tmp;
   }
}