天天看点

SP1811 LCS - Longest Common Substring

/**
 * @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;
}