题目链接:​​传送门​

求LCS
可不是那个dp了
SAM的板子题
对一个串建SAM然后匹配另一个串
一直跳就可以
注意细节。
也没有什么细节,

/**
* @Date: 2019-03-07T19:44:57+08:00
* @Last modified time: 2019-03-07T19:45:05+08:00
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <complex>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define
#define

using namespace std;
typedef long long ll;
char s1[A], s2[A];
int t, k, last = 1, n = 1, ans, son[A][26], fa[A], mx[A], cnt;
void insert(int fr) {
int p = last, np = ++n; last = np, mx[np] = mx[p] + 1;
while (p and !son[p][fr]) son[p][fr] = np, p = fa[p];
if (!p) fa[np] = 1;
else {
int q = son[p][fr];
if (mx[q] == mx[p] + 1) fa[np] = q;
else {
int nq = ++n; mx[nq] = mx[p] + 1;
memcpy(son[nq], son[q], sizeof son[q]);
fa[nq] = fa[q]; fa[q] = fa[np] = nq;
while (son[p][fr] == q) son[p][fr] = nq, p = fa[p];
}
}
}

int main(int argc, char const *argv[]) {
cin >> (s1 + 1) >> (s2 + 1); int len1 = strlen(s1 + 1), len2 = strlen(s2 + 1);
for (int i = 1; i <= len1; i++) insert(s1[i] - 'a'); int p = 1;
for (int i = 1; i <= len2; i++) {
if (son[p][s2[i] - 'a']) cnt++, p = son[p][s2[i] - 'a'];
else {
while (p and !son[p][s2[i] - 'a']) p = fa[p];
if (!p) cnt = 0, p = 1;
else cnt = mx[p] + 1, p = son[p][s2[i] - 'a'];
}
ans = max(ans, cnt);
}
cout << ans << endl;
return 0;
}