假设最长串为aaa…,其长度为x,子串从a到aaa…,总用长即为x*(x+1)/2<=1e5,x<=500。
最长串<=500,所以对于所有长度小于500的串,O(n^2)枚举所有子串,O(1)哈希判断是否子串存在,设串长分别为x1,x2…xk,则总时间复杂度x1^2+x2^2+…+xk^2<=500*(x1+x2+…+xk)<=500*1e5<=5e7,所以可以保证时间复杂度。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ull unsigned long long
#define endl '\n'
#define deb(n) cout << #n << "=" << n << " "
#define debug(n) cout << #n << "=" << n << endl
#define div() cout << "_______________" << endl
const int N = 1e5 + 10, P = 131;
int n;
unordered_map<int, int> mp;
string A[N];
ull h[N], p[N];
ull geths(int l, int r) {
return h[r] - h[l - 1] * p[r - l + 1];
}
void oper() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> A[i];
for (int i = 1; i <= n; i++) {
ull hs = 0;
for (int j = 0; j < A[i].size(); j++) hs = hs * P + A[i][j];
mp[hs] = 1;
}
int maxa = 0;
for (int i = 1; i <= n; i++) {
if (A[i].size() > 500) continue;
int m = A[i].size();
string tmp = '0' + A[i];
for (int j = 1; j <= m; j++) h[j] = h[j - 1] * P + tmp[j];
int flag = 1;
for (int j = 1; j <= m; j++) {
for (int k = j; k <= m; k++) {
int tar = geths(j, k);
if (!mp.count(tar)) flag = 0;
}
}
if (flag) maxa = max(maxa, m);
}
cout << maxa << endl;
}
signed main() {
p[0] = 1;
for (int i = 1; i < N; i++) p[i] = p[i - 1] * P;
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1; //cin >> t;
while (t--) oper();
return 0;
}