用的 SAM,输入格式也改了,感觉很玄学。
#include <bits/stdc++.h>
#define int long long
using namespace std;
int read() {
int s = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
f = (ch == '-' ? -1 : 1), ch = getchar();
while (ch >= '0' && ch <= '9')
s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * f;
}
#define N 1000005
int n;
char s[N];
struct SAM {
int SZ = 1, lst = 1;
struct node {
int len = 0, lnk = 0, nxt[26] = {0};
void init() {
len = lnk = 0;
memset(nxt, 0, sizeof nxt);
}
} t[N << 1];
int to[N << 1], nxt[N << 1], head[N << 1], tot = 0;
int ans[N << 1], mat[N << 1];
vector<int> e[N << 1];
void init() {
SZ = lst = 1, tot = 0;
memset(head, 0, sizeof head);
t[1].init();
}
void add(char ch) {
int cur = ++SZ;
t[cur].init(), t[cur].len = t[lst].len + 1, ans[cur] = t[cur].len;
int p = lst;
for (; p && !t[p].nxt[ch - 'a']; p = t[p].lnk)
t[p].nxt[ch - 'a'] = cur;
if (!p) {
t[cur].lnk = 1;
lst = cur;
return ;
}
int q = t[p].nxt[ch - 'a'];
if (t[q].len == t[p].len + 1) {
t[cur].lnk = q;
lst = cur;
return ;
}
int nq = ++SZ;
t[nq].init(), t[nq] = t[q], t[nq].len = t[p].len + 1, t[cur].lnk = t[q].lnk = nq;
for (int i = p; i && t[i].nxt[ch - 'a'] == q; i = t[i].lnk)
t[i].nxt[ch - 'a'] = nq;
lst = cur;
}
void pre() {
for (int i = 2; i <= SZ; i++)
e[t[i].lnk].push_back(i);
}
void dfs(int x) {
for (int y : e[x])
dfs(y), mat[x] = max(mat[x], mat[y]);
}
void match() {
memset(mat, 0, sizeof mat);
int cur = 1, len = 0;
for (int i = 1; i <= n; i++) {
while (cur && !t[cur].nxt[s[i] - 'a'])
cur = t[cur].lnk, len = t[cur].len;
if (!cur)
cur = 1, len = 0;
else
len++, cur = t[cur].nxt[s[i] - 'a'];
mat[cur] = max(mat[cur], len);
}
dfs(1);
for (int i = 1; i <= SZ; i++)
ans[i] = min(ans[i], mat[i]);
}
int calc() {
int res = 0;
for (int i = 1; i <= SZ; i++)
res = max(res, ans[i]);
return res;
}
} sam;
signed main() {
scanf("%s", s + 1), n = strlen(s + 1);
for (int i = 1; i <= n; i++)
sam.add(s[i]);
sam.pre();
while (~scanf("%s", s + 1))
n = strlen(s + 1), sam.match();
printf("%lld\n", sam.calc());
return 0;
}