poj 1743 Musical Theme(后缀数组、二分)
来源:互联网 发布:mac快捷键删除 编辑:程序博客网 时间:2024/04/27 23:09
题目链接:
http://poj.org/problem?id=1743
题目大意:
求不重叠的最长相同变化的子串,也就是最大长度的不重叠重复子串,输出其长度。
思路:
可以利用后缀数组中的height数组。height数组的性质:hegiht[i]表示后缀排名i和i-1的最长公共子序列。现在要求不重叠的重复子串,我们可以将height分组,对于hegiht[i]>=p来说,既然已经满足了lcp>=p,那么剩下的我们只需要满足这两个子串位置>=p,也就是sa[i]-sa[j]>=p。
所以我们只需要二分枚举最大长度p,然后判断在这个长度上能否满足条件即可。
代码:
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int MAXN = 20005;int rank[MAXN],height[MAXN];int str[MAXN],s[MAXN];int sa[MAXN],t[MAXN],t2[MAXN],c[MAXN];void build_sa(int m,int n){ int i, *x=t, *y=t2; for(i=0;i<m;i++)c[i]=0; for(i=0;i<n;i++)c[x[i]=s[i]]++; for(i=1;i<m;i++)c[i]+=c[i-1]; for(i=n-1;i>=0;i--)sa[--c[x[i]]]=i; for(int k=1;k<=n;k<<=1){ int p=0; for(i=n-k;i<n;i++)y[p++]=i; for(i=0;i<n;i++)if(sa[i]>=k)y[p++]=sa[i]-k; for(i=0;i<m;i++)c[i]=0; for(i=0;i<n;i++)c[x[y[i]]]++; for(i=0;i<m;i++)c[i]+=c[i-1]; for(i=n-1;i>=0;i--)sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1;x[sa[0]]=0; for(i=1;i<n;i++) x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++; if(p>=n)break; m=p; }}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--; int j=sa[rank[i]-1]; while(s[i+k]==s[j+k])k++; height[rank[i]]=k; }}int main(){ int n,i,j,k; while(~scanf("%d",&n)){ if(n==0)break; for(i=0;i<n;i++){ scanf("%d",&s[i]); } for(i=0;i<n-1;i++){ s[i]=s[i+1]-s[i]+88; } n--; build_sa(200,n+1); getHeight(n); int l=1,r=n; int maxi,mini; while(l<=r){ int mid=l+r>>1; maxi=0;mini=9999999; for(i=1;i<=n;i++){ if(height[i]>mid){ mini=min(mini,sa[i]); mini=min(mini,sa[i-1]); maxi=max(maxi,sa[i]); maxi=max(maxi,sa[i-1]); } } if(maxi-mini>=mid)l=mid+1; else r=mid-1; } if(r<4)printf("0\n"); else printf("%d\n",r+1); }}
0 0
- [后缀数组+二分] poj 1743 Musical Theme
- POJ 1743 Musical Theme 后缀数组+二分
- poj 1743 Musical Theme(后缀数组、二分)
- POJ-1743 Musical Theme,后缀数组+二分!
- POJ 1743 Musical Theme <后缀数组+二分>
- POJ 1743 Musical Theme 后缀数组 二分
- POJ 1743 Musical Theme 后缀数组+二分
- POJ 1743 Musical Theme(二分+后缀数组)
- poj 1743 Musical Theme(后缀数组+二分)
- poj 1743 Musical Theme (后缀数组+二分答案)
- Poj 1743Musical Theme|后缀数组|二分答案
- POJ 1743 Musical Theme(二分+后缀数组)
- POJ-1743-Musical Theme(后缀数组+二分)
- POJ 1743 Musical Theme(后缀数组+二分)
- POJ 1743 Musical Theme (二分后缀数组LCP)
- Poj 1743 Musical Theme(后缀数组+二分答案)
- POJ 1743 Musical Theme (后缀数组 + 二分)
- poj 1743 Musical Theme (二分+后缀数组)
- Leetcode 275. H-Index II (Medium) (cpp)
- Hermit 音乐播放器 2.4.1
- Android service里面启动activity和alertdialog .
- Could not create the view: An unexpected exception was thrown. java.lang.NullPointerException a
- frame 和 bounds IOS
- poj 1743 Musical Theme(后缀数组、二分)
- Retrofit使用之自定义Converter
- Android中使用Apache Commons Codec找不到类或者方法错误
- Java中properties配置文件的读取
- 排序算法
- Maven学习总结(九)——使用Nexus搭建Maven私服
- Snmp最基本概念
- 五大常用算法之三:贪心算法
- I/O多路转接之epoll