又来码一遍模板题~.~
然后还码错啦 fa[nq] = fa[q] 打成了fa[nq] = p
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#define SF scanf
#define PF printf
#define idx(c) (c-'a')
using namespace std;
typedef long long LL;
const int MAXN = 250000;
int ncnt, last;
struct SAM {
int ch[MAXN*2+10][26], fa[MAXN*2+10], step[MAXN*2+10];
int last, ncnt;
SAM () { last = ++ncnt; }
void extend(int c) {
int p = last, np = last = ++ncnt;
step[np] = step[p]+1;
while(!ch[p][c] && p) ch[p][c] = np, p = fa[p];
if(!p) fa[np] = 1;
else {
int q = ch[p][c], nq;
if(step[q] == step[p]+1) fa[np] = q;
else {
nq = ++ncnt;
step[nq] = step[p]+1;
memcpy(ch[nq], ch[q], sizeof(ch[q]));
fa[nq] = fa[q]; fa[q] = nq; fa[np] = nq;
while(ch[p][c] == q && p) ch[p][c] = nq, p = fa[p];
}
}
}
void build(char *s) {
int len = strlen(s);
for(int i = 0; i < len; i++) extend(idx(s[i]));
}
void solve(char *s) {
int len = strlen(s);
int cur = 0, ans = 0, u = 1;
for(int i = 0; i < len; i++) {
int c = idx(s[i]);
if(ch[u][c]) {
cur++;
u = ch[u][c];
}
else {
while(!ch[u][c] && u) u = fa[u];
if(!u)
u = 1, cur = 0;
else
cur = step[u]+1, u = ch[u][c];
}
ans = max(ans, cur);
}
PF("%d\n", ans);
}
} ac;
char s1[MAXN+10], s2[MAXN+10];
int main() {
SF("%s%s", s1, s2);
ac.build(s1);
ac.solve(s2);
return 0;
}