做电影网站哪个系统好,网站设计哪家最好,wordpress 时间调用,安阳网络教研平台正题
题目链接:https://www.luogu.com.cn/problem/P2463 题目大意 nnn个长度不同的数字序列#xff0c;序列的子串相同的定义是该子串相邻的两两差相同。
求公共子串的最长长度。 解题思路
做一个差分后问题就变为了求nnn个串的最长公共子串。
我们将所有的字符串接在一起…正题
题目链接:https://www.luogu.com.cn/problem/P2463 题目大意
nnn个长度不同的数字序列序列的子串相同的定义是该子串相邻的两两差相同。
求公共子串的最长长度。 解题思路
做一个差分后问题就变为了求nnn个串的最长公共子串。
我们将所有的字符串接在一起并且在每个之间加一个不同的大数。
然后我们考虑使用SASASA前计算出HeightHeightHeight数组。然后二分答案对于可能的答案midmidmid满足条件有一串连续的Height≥midHeight\geq midHeight≥mid且这一串的saisa_isai包含每一个串的部分。
时间复杂度O(mnlog(mn))O(mn\log (mn))O(mnlog(mn)) codecodecode
#includecstdio
#includecstring
#includealgorithm
#includestack
using namespace std;
const int N2e610;
int num,n,m,a[1100][1100],s[N],len[N],id[N];
int c[N],x[N],y[N],sa[N],rank[N],height[N];
bool v[N];
stackint S;
void Qsort(){for(int i1;im;i) c[i]0;for(int i1;in;i) c[x[i]];for(int i1;im;i) c[i]c[i-1];for(int in;i1;i--) sa[c[x[y[i]]]--]y[i],y[i]0;
}
void Get_SA(int *s){for(int i1;in;i)x[i]s[i],y[i]i;Qsort();for(int w1;wN;w1){int p0;for(int in-w1;in;i) y[p]i;for(int i1;in;i)if(sa[i]w) y[p]sa[i]-w;Qsort();swap(x,y);x[sa[1]]p1;for(int i1;in;i)x[sa[i]](y[sa[i]]y[sa[i-1]]y[sa[i]w]y[sa[i-1]w])?p:p;if(pn) break;mp;}
}
void Get_Height(int *s){int k0;for(int i1;in;i)rank[sa[i]]i;for(int i1;in;i){if(rank[i]1) continue;if(k) k--;int jsa[rank[i]-1];while(jknikns[jk]s[ik]) k;height[rank[i]]k;}
}
bool check(int x){while(!S.empty()) v[S.top()]0,S.pop();for(int i1;in;i){if(height[i]x)while(!S.empty())v[S.top()]0,S.pop();if(!v[id[sa[i]]]){v[id[sa[i]]]1;S.push(id[sa[i]]);if(S.size()num)return 1;}}return 0;
}
int main()
{scanf(%d,num);int l0,r2147483647;for(int i1;inum;i){scanf(%d,len[i]);for(int j1;jlen[i];j){scanf(%d,a[i][j]);if(j!1) mmax(m,a[i][j]-a[i][j-1]);}rmin(r,len[i]-1);}for(int i1;inum;i){for(int j2;jlen[i];j){s[n]a[i][j]-a[i][j-1];id[n]i;}s[n]m;}Get_SA(s);Get_Height(s);while(lr){int mid(lr)1;if(check(mid)) lmid1;else rmid-1;}printf(%d,r1);
}