SAM又神又恶心- -
#include<bits/stdc++.h>
using namespace std;
const int maxn=250010;
struct node{
node *f,*ch[26];
int ml;
}pool[maxn*2],*init=pool,*cur=pool,*tail=init;
void add(int c,int len){
node *p=tail,*np=++cur;
np->ml=len;
for(;p&&!p->ch[c];p=p->f) p->ch[c]=np;
tail=np;
if(!p) np->f=init;
else{
if(p->ch[c]->ml==p->ml+1) np->f=p->ch[c];
else{
node *q=p->ch[c],*nq=++cur;
*nq=*q;
nq->ml=p->ml+1;
q->f=np->f=nq;
for(;p&&p->ch[c]==q;p=p->f) p->ch[c]=nq;
}
}
}
int walk(char *t){
node *x=init;
int ans=0,now=0,c;
for(;*t;++t){
c=*t-'a';
if(x->ch[c]) ++now,x=x->ch[c];
else{
while(x&&!x->ch[c]) x=x->f;
if(!x) x=init,now=0;
else now=x->ml+1,x=x->ch[c];
}
if(now>ans) ans=now;
}
return ans;
}
char s[maxn],t[maxn];
int main(){
gets(s);gets(t);
int i=0;
for(register char *c=s;*c;++c) add(*c-'a',++i);
printf("%d\n",walk(t));
return 0;
}