#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define popcount __builtin_popcount using namespace std; typedef long long int ll; typedef pair P; #define MP make_pair #define fi first #define se second #define ALL(a) (a).begin(),(a).end() struct SuffixArray{ ll size; string s; vectordata; SuffixArray(string S):size(S.size()),s(S){ s += '$'; vectorinput(s.size()); for(ll i=0;i induced_sort(vectort, ll kind){ ll sz = t.size(); vectorls(sz);//trueはL型,falseはS型 for(ll i = sz-1;i>=0;i--){ if(i==sz-1)ls[i] = false; else{ if(t[i]!=t[i+1])ls[i] = (t[i] > t[i+1]); else ls[i] = ls[i+1]; } } vectorcnt(kind); for(ll i=0;ilr(kind,MP(-1,-1)); for(ll i=1;ilmsidx,ret(sz,-1); for(ll i=0;i=1&&ls[ret[i]-1]){ ret[lr[t[ret[i]-1]].fi+cnt[t[ret[i]-1]]]=ret[i]-1; cnt[t[ret[i]-1]]++; if(i!=0&&!ls[ret[i]])ret[i]=-1; } } fill(ALL(cnt),0); for(ll i=sz-1;i>=1;i--){ if(ret[i]>=1&&!ls[ret[i]-1]){ ret[lr[t[ret[i]-1]].se-cnt[t[ret[i]-1]]]=ret[i]-1; cnt[t[ret[i]-1]]++; } } vectorrev_lmsidx(sz,-1),lmsinput(lmsidx.size(),-1); for(ll i=0;icomp(t.begin()+ret[0],t.end()); for(ll i=1;i=1&&ls[ret[i]-1]&&!ls[ret[i]]){ vectortmp(t.begin()+ret[i],t.begin()+lmsidx[rev_lmsidx[ret[i]]+1]+1); if(comp != tmp){ kindnum++; comp = tmp; } lmsinput[rev_lmsidx[ret[i]]] = kindnum; } } vectoroutput; if(kindnum==lmsidx.size()){ output.assign(kindnum,-1); for(ll i=0;i=0;i--){ ll tmp=lmsidx[output[i]]; ret[lr[t[tmp]].se - cnt[t[tmp]]]=tmp; cnt[t[tmp]]++; } fill(ALL(cnt),0); for(ll i=0;i=1&&ls[ret[i]-1]){ ret[lr[t[ret[i]-1]].fi+cnt[t[ret[i]-1]]]=ret[i]-1; cnt[t[ret[i]-1]]++; if(i!=0&&!ls[ret[i]])ret[i]=-1; } } fill(ALL(cnt),0); for(ll i=sz-1;i>=1;i--){ if(ret[i]>=1&&!ls[ret[i]-1]){ ret[lr[t[ret[i]-1]].se-cnt[t[ret[i]-1]]]=ret[i]-1; cnt[t[ret[i]-1]]++; } } return ret; } ll operator[](const int &k) const{ return data[k]; } }; struct LCP{ SuffixArray sa; vector lcp, rk; LCP(SuffixArray sa):sa(sa), lcp(sa.size), rk(sa.size+1){ rk[sa.size]=0; for(int i=0; i0) h--; for(; j+h manacher(const string &s) { vector< int > radius(s.size()); int i = 0, j = 0; while(i < s.size()) { while(i - j >= 0 && i + j < s.size() && s[i - j] == s[i + j]) { ++j; } radius[i] = j; int k = 1; while(i - k >= 0 && i + k < s.size() && k + radius[i - k] < j) { radius[i + k] = radius[i - k]; ++k; } i += k; j -= k; } return radius; } int main() { int n, m; string s, t; cin>>s>>t; n=s.size(), m=t.size(); string u=s+"a"+t; vector> rs(2, vector(n)), rt(2, vector(m)); rs[1]=manacher(s), rt[1]=manacher(t); { string s0, t0; s0+='#'; t0+='#'; for(int i=0; i rs0=manacher(s0), rt0=manacher(t0); for(int i=0; i> rd(2, vector(n+m)); for(int i=0; ivoid{ if(l>r) return; int mid=(l+r)/2; vector mnl(mid-l+1), mnr(r-mid+1); mnl[mid-l]=lcp[mid]; for(int i=mid-1; i>=l; i--){ mnl[i-l]=min(mnl[i+1-l], lcp[i]); } mnr[0]=lcp[mid]; for(int i=mid+1; i<=r; i++){ mnr[i-mid]=min(mnr[i-1-mid], lcp[i]); } for(int p=0; p<2; p++){ vector vls, vlt; vector sls, slt; for(int i=mid; i>=l; i--){ int x=min(mnl[i-l], rd[p][i-1]); if(sa[i-1]