可以暴力破解,这里贴的代码没有模版
int who[Max], yes[101], ii;
int len, n, nn;
int ans[Max], ss;
int check(int mid)
{
int i, j, k, t, s, flag = 0;
for (i = 2; i <= len; i = j + 1) {
for (; height[i] < mid && i <= len; i++) ;
for (j = i; height[j] >= mid; j++) ;
if (j - i + 1 < n) continue;
ii++; s = 0;
for (k = i - 1; k < j; k++)
if ((t = who[sa[k]]) != 0)
if (yes[t] != ii)
yes[t] = ii, s++;
if (s >= n) return 1;
}
return 0;
}
int r[Max];
int main()
{
int i, j, k;
char s[1005];
int flag = 0;
int t;
cin>>t;
while (t--) {
scanf("%d", &n);
len = 0;
for (i = 1; i <= n; ++i) {
scanf("%s", s);
int k = strlen(s);
for (j = 0; j < k; ++j) {
r[j + len] = s[j] + 200;
who[j + len] = i;
}
r[len + k] = 2 * i - 1;
who[len + k] = 0;
len += k + 1;
for (j = 0; j < k; ++j) {
r[j + len] = s[k - j - 1] + 200;
who[j + len] = i;
}
r[len + k] = 2 * i;
who[len + k] = 0;
len += k + 1;
}
--len;
r[len] = 0;
memset(sa, 0, sizeof(sa));
da(r, len + 1, 500);
calHeight(r, len);
height[len + 1] = -1;
int min = 1, max = 100;
while (min <= max) {
int mid = (min + max) >> 1;
if (check(mid)) min = mid + 1;
else max = mid - 1;
}
if (n == 1) max = len / 2;
printf("%d\n", max);
}
return 0;
}