#include using namespace std; #define rep(i,a,b) for(int i=a; i pii; const int alfa=28; vector rob, tree; vector > graf; vector znak, up, dlu, tab, vat; vector dp; vector kol; string note; int n, m; int x; void add (string &s, int pos=0, int a=0) { if (pos==(int)s.size()) { dlu[a]=max(dlu[a], pos); return; } if (graf[a][s[pos]-'a']==-1) { dlu.pb(0); vat.pb(a); znak.pb(s[pos]-'a'); kol.pb(mp(pos,x)); graf[a][s[pos]-'a']=x++; graf.pb(rob); debug ("new node %d\n", x-1); //cerr <0) walk(up[a], pos); else walk(a,pos+1); return; } else { tab[pos]=dlu[graf[a][note[pos]-'a']]; walk(graf[a][note[pos]-'a'], pos+1); } } void ustaw (int x, int y, int a=1, int lewy=0, int prawy=m-1) { if (lewy=prawy) return tree[a]; else { int ret=1e9; if (left<=mitte) ret=min(ret, mini(left, right, a*2, lewy, mitte)); if (right>mitte) ret=min(ret, mini(left, right, a*2+1, mitte+1, prawy)); return ret; } } int main() { ios_base::sync_with_stdio(false); x=1; rob.resize(alfa,-1); dlu.pb(0); vat.pb(0); znak.pb(-1); graf.pb(rob); cin>>n >>note; m=note.size(); string s; rep(i,0,n) { cin>>s; add(s); } sort(kol.begin(), kol.end()); up.resize(x,0); for (pair k: kol) { if (vat[k.se]==up[k.se]) continue; up[k.se]=suf(znak[k.se], up[vat[k.se]]); dlu[k.se]=max(dlu[k.se], dlu[up[k.se]]); debug ("%d %d\n", k.se, up[k.se]); } debug ("aho gotowe\n"); //return 0; tab.resize(m,0); dp.resize(m,1e9); walk(); //teraz drzewo: tree.resize(m*4+10,1e9); rep(i,0,m) { debug ("%d\n", i); if (tab[i]==i+1) dp[i]=1; else { dp[i]=mini(i-tab[i], i)+1; } ustaw(i, dp[i]); debug ("do %d: %d\n", i, dp[i]); } if (dp[m-1]==1e9) cout<<"-1\n"; else cout<