存个模板,感谢然哥的模板
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 500005;
const int maxc = 26;
int go[maxn][26];
int len[maxn];
int f[maxn];
class suffix_automaton
{
public:
const static int head = 1;
int last;
int use;
int get()
{
use++;
memset(go[use],0,sizeof(go[use]));
return use;
}
void init()
{
use=-1;
last=1;
get();
get();
f[0]=f[1]=len[0]=len[1]=0;
return;
}
void extend(int c)
{
int now =last;
int end = get();
len[end]=len[last]+1;
last=end;
for(;now&&!go[now][c];now=f[now])
{
go[now][c]=end;
}
if(!now)
{
f[end]=head;
}
else
{
int to = go[now][c];
if(len[now]+1==len[to])
{
f[end]=to;
}
else
{
int np = get();
memcpy(go[np],go[to],sizeof(go[to]));
len[np]=len[now]+1;
f[np]=f[to];
f[to]=f[end]=np;
for(;now&&go[now][c]==to;now=f[now])
{
go[now][c]=np;
}
}
}
}
}SAM;
char a[maxn/2],b[maxn/2];
int main()
{
scanf("%s%s",a,b);
SAM.init();
for(int i=0;a[i];++i) SAM.extend(a[i]-'a');
int ans=0,l=0;
int now = SAM.head;
for(int i=0;b[i];++i)
{
int c = b[i]-'a';
if(go[now][c])
{
l++;
now=go[now][c];
}
else
{
while(now&&go[now][c]==0)
{
now=f[now];
}
if(!now)
{
now=SAM.head;
l=0;
}
else
{
l=len[now]+1;
now = go[now][c];
}
}
ans=max(ans,l);
}
printf("%d\n",ans);
}