| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 
 | #include <bits/stdc++.h>using namespace std;
 using LL = long long;
 #define FOR(i, x, y) for (decay<decltype(y)>::type i = (x), _##i = (y); i < _##i; ++i)
 #define FORD(i, x, y) for (decay<decltype(x)>::type i = (x), _##i = (y); i > _##i; --i)
 #ifdef zerol
 #define dbg(args...) do { cout << "\033[32;1m" << #args << " -> "; err(args); } while (0)
 #else
 #define dbg(...)
 #endif
 void err() { cout << "\033[39;0m" << endl; }
 template<template<typename...> class T, typename t, typename... Args>
 void err(T<t> a, Args... args) { for (auto x: a) cout << x << ' '; err(args...); }
 template<typename T, typename... Args>
 void err(T a, Args... args) { cout << a << ' '; err(args...); }
 
 const int maxn = 3E5 + 100;
 
 namespace SAM {
 const int M = maxn << 1;
 int t[M][26], len[M] = {-1}, fa[M], sz = 2, last = 1;
 void ins(int ch) {
 int p = last, np = last = sz++;
 len[np] = len[p] + 1;
 while (p && !t[p][ch]) {
 t[p][ch] = np; p = fa[p];
 }
 if (!p) { fa[np] = 1; return; }
 int q = t[p][ch];
 if (len[p] + 1 == len[q]) fa[np] = q;
 else {
 int nq = sz++; len[nq] = len[p] + 1;
 memcpy(t[nq], t[q], sizeof t[0]);
 fa[nq] = fa[q];
 fa[np] = fa[q] = nq;
 while (t[p][ch] == q) {
 t[p][ch] = nq; p = fa[p];
 }
 }
 }
 int go(char* s) {
 int ret = 0, cur = 1, cnt = 0;
 FOR (i, 0, strlen(s)) {
 int c = s[i] - 'a';
 if (t[cur][c]) ++cnt;
 else {
 while (cur && !t[cur][c]) cur = fa[cur];
 cnt = len[cur] + 1;
 }
 cur = cur ? t[cur][c] : 1;
 ret = max(ret, cnt);
 }
 return ret;
 }
 }
 
 char s[maxn];
 int main() {
 scanf("%s", s);
 FOR (i, 0, strlen(s)) SAM::ins(s[i] - 'a');
 scanf("%s", s);
 cout << SAM::go(s) << endl;
 }
 
 |