题意是给n个串,求出一个最长的子串在每个串中至少出现两次。直接二分答案来判断,因为题目里要求在一个串中,两次出现的位置不能有交叉,所以这要想办法特殊处理下,大体的思路还是循环height数组,按>=当前二分长度来分组,处理一组时,用两个数组分别记录一下本组后缀在各个串中出现的最大位置和最小位置,那么如果某一个串上他的最大位置和最小位置的差大于等于当前长度了,就是两个没有交叉的匹配了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn=220100;
int s[maxn];
int sa[maxn],t[maxn],t2[maxn],c[maxn];
int sa2[maxn];
char s1[maxn],s2[maxn];
int rank[maxn],height[maxn];
int l1,l2;
int len,len1;
int n,m,ans;
int belong[maxn];
inline int idx(char s)
{
if (s>='a' && s<='z') return s-'a'+11;
}
void getheight(int n)
{
int i,j,k=0;
for (i=0; i<=n; i++) rank[sa[i]]=i;
for (i=0; i<n; i++)
{
if (k) k--;