POJ1743 Musical Theme 题解&代码
来源:互联网 发布:开淘宝网店怎么推广 编辑:程序博客网 时间:2024/05/11 00:15
后缀数组…
对最长不重叠子串长度进行二分判定,判定方式是暴力分组
利用height[]的性质:如果height[i]>x,height[i-1]>x,那么存在从sa[i-2]到sa[i]的部分最长公共子串大于x
可以推论:对于height[i]~height[j]均大于x,那么存在sa[i-1]到sa[j]的部分最长公共子串大于x
这样可以得出对于一段连续的满足条件的height[],有连续的多个sa[]公共子串满足条件,用l和r维护最长起始位置差
That’s all.
#include <iostream>#include <cstdio>using namespace std;const int maxn = 20005;int n, l, r, mid, str[maxn], s[maxn];int wa[maxn], wb[maxn], wv[maxn], cnt[maxn];int sa[maxn], height[maxn], Rank[maxn];void DA(int *r,int n,int m){ int *x = wa, *y = wb, p; for(int i = 0; i < m; i++) cnt[i] = 0; for(int i = 0; i < n; i++) cnt[ x[i] = r[i] ]++; for(int i = 1; i < m; i++) cnt[i] += cnt[i-1]; for(int i = n-1; i >= 0; i--) sa[--cnt[x[i]]] = i; for(int j = 1; j < n ; j=j<<1) { p = 0; for(int i = n-j; i < n; i++) y[p++] = i; for(int i = 0; i < n; i++) if(sa[i] >= j) y[p++] = sa[i]-j; for(int i = 0; i < n; i++) wv[i] = x[y[i]]; for(int i = 0; i < m; i++) cnt[i] = 0; for(int i = 0; i < n; i++) cnt[wv[i]]++; for(int i = 1; i < m; i++) cnt[i] += cnt[i-1]; for(int i = n-1; i >= 0; i--) sa[--cnt[wv[i]]] = y[i]; swap(x, y); p = 1; x[sa[0]] = 0; for(int i = 1; i < n; i++) x[sa[i]] = (y[sa[i]] == y[sa[i-1]]) && (y[sa[i]+j] == y[sa[i-1]+j]) ? p-1 : p++; if(p >= n) break; m = p; }}void calheight(int *r,int n){ for(int i = 1; i <= n; i++)Rank[sa[i]] = i; int j = 0, k = 0; for(int i = 0; i < n; height[Rank[i]] = k, i++) for(k?k--:k=0, j = sa[Rank[i]-1]; r[i+k] == r[j+k]; k++);}bool check(int x){ int l = sa[0], r = sa[0]; for(int i = 0; i < n; i++) { if(height[i] < x) { l = sa[i]; r = sa[i]; continue; } l = min(l, sa[i]); r = max(r, sa[i]); if(r-l >= x) return true; } return false;}int main(void){ while(scanf("%d", &n) && n) { for(int i = 0; i < n; i++) { scanf("%d", &str[i]); if(i) s[i-1] = str[i]-str[i-1], s[i-1] += 100; } s[n-1] = 0; DA(s, n, 200); calheight(s, n-1); l = 0, r = n-1; while(l < r) { mid = (l+r)/2; if(check(mid)) l = mid+1; else r = mid; } printf("%d\n",l >= 5? l : 0 ); } return 0;}
0 0
- POJ1743 Musical Theme 题解&代码
- POJ1743 Musical Theme
- POJ1743--Musical Theme
- POJ1743 Musical Theme
- POJ1743 Musical Theme
- POJ1743 Musical Theme
- POJ1743:Musical Theme
- POJ1743-Musical Theme
- Poj1743 Musical Theme
- poj1743:Musical Theme(后缀数组)
- 后缀数组 - poj1743 Musical Theme
- POJ1743 Musical Theme 后缀数组
- poj1743:Musical Theme(后缀数组)
- poj1743 Musical Theme (后缀数组)
- poj1743 Musical Theme【解法一】
- poj1743 Musical Theme 后缀数组
- [后缀数组]poj1743 Musical Theme
- poj1743 Musical Theme 二分+后缀数组
- 关于新浪SaeApp--个人使用感受。
- 古堡算式
- resultSet,resultSetMetaData,list查询结果 的使用测试
- 判断字符是否匹配
- iOS 动画Animation-2-2: 动画基础:核心动画
- POJ1743 Musical Theme 题解&代码
- 21. Merge Two Sorted Lists
- 51nod1284 2 3 5 7的倍数
- sleep和wait的区别
- jsp连接数据
- iOS -TabBar
- 比酒量
- AlphaGo首局战胜李世石
- cto首席技术官的知识点