rt,过了LCS1
#pragma GCC target ("avx")
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>
using namespace std;
const int base = 131, m1 = 13331, m2 = 13331;
struct hashmap {
int a[1000005], v[1000005];
inline void clear() {
memset(v, 0, sizeof(v));
return;
}
inline int hash(long long x) {
return (x % 1000005 + 1000005) % 1000005;
}
inline int& operator[](long long x) {
register int cur = hash(x), cnt = 1;
while((a[cur] ^ x) && v[cur])
cur = (cur + cnt * cnt) % 1000005, cnt++;
a[cur] = x;
return v[cur];
}
}mp, vis;
string s[15];
int n, l = -1, r;
long long p1[100005] = {1}, p2[100005] = {1}, h[15][100005], h2[15][100005];
long long H(int x, int y) {
return 1ll * x << 14 | y;
}
long long f1(int cur, int lt, int rt) {
return (h[cur][rt] - h[cur][lt - 1] * p1[rt - lt + 1] % m1 + m1) % m1;
}
long long f2(int cur, int lt, int rt) {
return (h2[cur][rt] - h2[cur][lt - 1] * p2[rt - lt + 1] % m2 + m2) % m2;
}
bool check(int x) {
mp.clear();
for(int j = 1; j <= n; j++) {
vis.clear();
for(int i = 1; i + x - 1 < s[j].size(); i++)
if(!vis[H(f1(j, i, i + x - 1), f2(j, i, i + x - 1))])
vis[H(f1(j, i, i + x - 1), f2(j, i, i + x - 1))] = 1, mp[H(f1(j, i, i + x - 1), f2(j, i, i + x - 1))]++;
}
for(int i = 1; i + x - 1 < s[1].size(); i++)
if(mp[H(f1(1, i, i + x - 1), f2(1, i, i + x - 1))] == n)
return 1;
return 0;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
for(n = 1; cin >> s[n]; n++) {
r = max(r, (int)s[n].size() + 1), s[n] = ' ' + s[n];
for(int j = 1; j < s[n].size(); j++)
h[n][j] = (h[n][j - 1] * base % m1 + s[n][j]) % m1, h2[n][j] = (h2[n][j - 1] * base % m2 + s[n][j]) % m2;
}
n--;
for(int i = 1; i < r; i++)
p1[i] = p1[i - 1] * base % m1, p2[i] = p2[i - 1] * base % m2;
while(l + 1 < r) {
int mid = l + r >> 1;
if(check(mid))
l = mid;
else
r = mid;
}
cout << l;
return 0;
}