坑死了 p什么的np什么的q什么的nq什么的 - -
都注意了构造还是写错了TAT
利用后缀自动机的性质:能接受所有子串
也就是说能接受的就一定是该串的子串
失配时要沿父亲走 原理同AC自动机
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int NODE = 250010<<1,CH = 26,root=1;
int ch[NODE][CH],val[NODE],par[NODE],sz,last;
inline char idx(char c) {return c-'a';}
inline int NN(int v=0)
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
par[sz]=0;
return sz++;
}
inline void init()
{
sz=0;
NN();
NN();
last=root;
}
inline void append(int c)
{
int p=last,np=NN(val[p]+1);
while(p&&!ch[p][c])
ch[p][c]=np,p=par[p];
if(!p)
par[np]=root;
else
{
int q=ch[p][c];
if(val[p]+1==val[q])
par[np]=q;
else
{
int nq=sz++; ///NN
val[nq]=val[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[nq]));
par[nq]=par[q];
par[np]=par[q]=nq;
while(p&&ch[p][c]==q)
ch[p][c]=nq,p=par[p];
}
}
last=np;
}
int find(char *s)
{
int u=root,ans=0,cnt=0,f=0;
for(;*s;s++,ans=max(cnt,ans))
{
int c= idx(*s);
while(!ch[u][c])
{
u=par[u];
cnt=val[u];
if(!u)
{
u=root;
cnt=0;
f=1;
break;
}
}
//puts("");
if(f)
f=0;
else
{
cnt++;
u=ch[u][c];
}
}
return max(ans,cnt);
}
void solve(char *s)
{
init();
for(int i=0;*s;s++)
append(idx(*s));
scanf("%s",s);
printf("%d",find(s));
}
char s[NODE];
int main()
{
//freopen("b.in","r",stdin);
scanf("%s",s);
solve(s);
return 0;
}
/*
abcdeeefg
eeaef
*/