#include using namespace std; //#define int long long #define INF 1000000000 const int baza = 1<<20; struct drzewo { vector drz; drzewo() : drz( baza*2+10 ) {} int czytaj( int pyt_pocz, int pyt_kon, int pocz=0, int kon=baza, int gdzie = 1 ) { if( pyt_pocz <= pocz && kon <= pyt_kon ) { return drz[gdzie]; } if( pyt_kon <= pocz || kon <= pyt_pocz ) { return INF; } int sr = (pocz+kon)/2; return min( czytaj( pyt_pocz, pyt_kon, pocz, sr, gdzie*2 ), czytaj( pyt_pocz, pyt_kon, sr, kon, gdzie*2+1 ) ); } void zmien( int gdzie, int co ) { gdzie += baza; drz[gdzie] = co; gdzie/=2; while( gdzie ) { drz[gdzie] = min( drz[gdzie*2], drz[gdzie*2+1] ); gdzie/=2; } } void add( int gdzie, int ile ) { gdzie += baza; drz[gdzie] += ile; gdzie/=2; while( gdzie ) { drz[gdzie] = min( drz[gdzie*2], drz[gdzie*2+1] ); gdzie/=2; } } int znajdz( int gdzie=0 ) { if( gdzie>=baza ) return gdzie-baza; if( drz[gdzie*2] == 0 ) return znajdz( gdzie*2 ); return znajdz( gdzie*2+1 ); } }; struct automat { vector> edges; vector link, length, dl; vector visited; int last; automat( string s ) { edges.push_back( {} ); link.push_back( -1 ); length.push_back( 0 ); dl.resize( 2*s.size()+10 ); visited.resize( 2*s.size() +10 ); last = 0; for( int i=0; i=0 && edges[p].find( s[i] ) == edges[p].end() ) { edges[p][s[i]] = r; p = link[p]; } if( p != -1 ) { int q = edges[p][s[i]]; if( length[p] + 1 == length[q] ) { link[r] = q; } else { edges.push_back( edges[q] ); length.push_back( length[p]+1 ); link.push_back( link[q] ); int qq = edges.size()-1; link[q] = qq; link[r] = qq; while( p>=0 && edges[p][s[i]] == q ) { edges[p][s[i]] = qq; p = link[p]; } } } last = r; } } void dfs( int gdzie ) { if( gdzie == -1 ) return; if( visited[gdzie] ) return; visited[gdzie] = 1; int i = link[gdzie]; dfs( i ); if( i!= -1 ) dl[gdzie] = max( dl[gdzie], dl[i] ); } void algo() { for( int i=0; i> n; string wzo; cin >> wzo; automat suf( wzo ); vector v; for( int i=1; i<=n; i++ ) { string s; cin >> s; v.push_back( s ); } for( string s : v ) { int gdzie = 0; for( char c : s ) { if( suf.edges[gdzie].find( c ) == suf.edges[gdzie].end() ) { gdzie = -1; break; } gdzie = suf.edges[gdzie][c]; } if( gdzie != -1 ) suf.dl[gdzie] = max( suf.dl[gdzie], (int)s.size() ); } drzewo x; for( int i=0; i<2*baza; i++ ) { x.drz[i] = INF; } x.zmien( 0, 0 ); wzo = '#' + wzo; int gdzie = 0; suf.algo(); for( int i=1; i= INF ) cout <<-1; else cout << x.drz[ wzo.size() + baza - 1 ]; return 0; } /* 3 aaaaa a aa aaa 2 5 abecedadabra abec ab ceda dad ra 5 9 icpccontesticpc international collegiate programming contest central europe regional contest icpc 3 */