#include using namespace std; struct node { int len; int kon; int najwz; node* kol[27]; node* suf; //string kurwa; node (int dl) { //kurwa=""; len=dl; kon=0; najwz=0; for(int i=0; i<27; i++) kol[i]=0; suf=0; } }; vector bfs[1000000]; int najkon[1000000]; int main() { node *subroot = new node (-1); node *root = new node (0); root->suf=subroot; bfs[0].push_back(root); for(int i=0; i<27; i++) { subroot->kol[i]=root; } int l; cin>>l; string haslo; cin>>haslo; while(l--) { string slowo; cin>>slowo; node *akt=root; //string pref=""; for(char c:slowo) { //pref+=c; int nr=int(c)-'a'; if(akt->kol[nr]==0) { akt->kol[nr]=new node (akt->len+1); //akt->kol[nr]->kurwa=pref; bfs[akt->len+1].push_back(akt->kol[nr]); } akt=akt->kol[nr]; } akt->kon=1; akt->najwz=akt->len; } //cerr<<"slowa"<kol[nr]==0) { akt->kol[nr]=new node (akt->len+1); //akt->kol[nr]->kurwa=pref; bfs[akt->len+1].push_back(akt->kol[nr]); } akt=akt->kol[nr]; } } //cerr<<"haslo"<kol[nr]!=0) { //cerr<<"SUFLINKI "<len<<" "<kurwa<suf; while(poz->kol[nr]==0) { //cerr<<"while "<len<<" "<kurwa<suf; } //cerr<<"git"<kol[nr]; w->kol[nr]->suf=poz; w->kol[nr]->najwz=max(w->kol[nr]->najwz, poz->najwz); } } } } /*{ cerr<<"SPR GOWNP"<kol[nr]==0) { cerr<<"GWONO"<kol[nr]=new node (akt->len+1); } akt=akt->kol[nr]; cerr<<"NAJ "<najwz<kol[nr]; if(akt->najwz>0) { najkon[akt->len-1-akt->najwz]=akt->len-2; } } } int kon=-1; int wyn=0; for(int i=0; i<(int)haslo.size()-1; i++) { najlepszy=max(najlepszy, najkon[i]); if(kon