首先对于每一个字符串进行一次哈希。
由于数据范围很小,所以二分一下公共串的长度 p p p,然后直接的暴力枚举找到长度为 p p p 的公共串,判断是否存在即可。
由于代码中使用了平板电视,所以时间复杂度是 O ( n 2 log 2 n ) \mathcal O(n^2\log ^2n) O(n2log2n) 的。可过。
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
#include <ext/pb_ds/list_update_policy.hpp>
#include <ext/pb_ds/priority_queue.hpp>
#include <ext/pb_ds/tag_and_trait.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/trie_policy.hpp>
#include <ext/rope>
#include <ext/hash_map>
#include <ext/hash_set>
#include <ext/algorithm>
#include <ext/rb_tree>
#include <ext/random>
using namespace std;
using ull = unsigned long long;
const int N = 2e5 + 10;
const ull base = 131;
ull bit[N], h[10][N];
char s[10][N];
ull get_hash(int p, int l, int r)
{
return h[p][r] - h[p][l - 1] * bit[r - l + 1];
}
int n, mi = 1e9;
bool check(int pivot)
{
__gnu_pbds::tree<ull, __gnu_pbds::null_type, less<ull>, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update> tree;
int l1 = strlen(s[1] + 1);
for (int l = 1, r = pivot; r <= l1; l++, r++)
if (tree.find(get_hash(1, l, r)) == tree.end())
tree.insert(get_hash(1, l, r));
for (int i = 2; i <= n; i++)
{
int len = strlen(s[i] + 1);
__gnu_pbds::tree<ull, __gnu_pbds::null_type, less<ull>, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update> t;
for (int l = 1, r = pivot; r <= len; l++, r++)
if (t.find(get_hash(i, l, r)) == t.end())
t.insert(get_hash(i, l, r));
vector<ull> vlt;
for (auto &val : tree)
if (t.find(val) == t.end())
vlt.push_back(val);
for (auto &vl : vlt)
tree.erase(tree.find(vl));
}
return tree.size() != 0;
}
signed main()
{
cin >> n;
bit[0] = 1;
for (int i = 1; i <= 2000; i++)
bit[i] = bit[i - 1] * base;
for (int i = 1; i <= n; i++)
{
scanf("%s", s[i] + 1);
int len = strlen(s[i] + 1);
for (int j = 1; j <= len; j++)
h[i][j] = h[i][j - 1] * base + s[i][j];
mi = min(mi, len);
}
int l = 1, r = mi, best = 0;
while (l <= r)
{
int mid = l + r >> 1;
if (check(mid))
l = mid + 1, best = mid;
else
r = mid - 1;
}
cout << best << '\n';
return 0;
}