POJ 1743 Musical Theme (后缀数组)
来源:互联网 发布:全栈工程师薪水 知乎 编辑:程序博客网 时间:2024/05/17 08:16
题目大意:
刚才上88个键弹出来的音符。
如果出现重复的,或者是高一个音阶的重复的都算。
思路分析:
具体可以参考训练指南222.
height数组表示按照排序后的sa最近的两个后缀的最长前缀。
将height 分块。然后二分答案,二分答案之后去判断是否满足。
要考虑到不重合,还有大于5。
所以二分的时候要从5开始,然后判断的时候要加一个 up - down >len
#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#define maxn 100005using namespace std;int str[maxn];int sa[maxn],t1[maxn],t2[maxn],c[maxn],n;void suffix(int m){ int *x=t1,*y=t2; for(int i=0;i<m;i++)c[i]=0; for(int i=0;i<n;i++)c[x[i]=str[i]]++; for(int i=1;i<m;i++)c[i]+=c[i-1]; for(int i=n-1;i>=0;i--)sa[--c[x[i]]]=i; for(int k=1;k<=n;k<<=1) { int p=0; for(int i=n-k;i<n;i++)y[p++]=i; for(int i=0;i<n;i++)if(sa[i]>=k)y[p++]=sa[i]-k; for(int i=0;i<m;i++)c[i]=0; for(int i=0;i<n;i++)c[x[y[i]]]++; for(int i=0;i<m;i++)c[i]+=c[i-1]; for(int i=n-1;i>=0;i--)sa[--c[x[y[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-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++; if(p>=n)break; m=p; }}int rank[maxn],height[maxn];void getheight(){ int k=0; for(int i=0;i<n;i++)rank[sa[i]]=i; for(int i=0;i<n;i++) { if(k)k--; if(!rank[i])continue; int j=sa[rank[i]-1]; while(str[i+k]==str[j+k])k++; height[rank[i]]=k; }}bool ok(int len){ int down,up; down=up=sa[0]; for(int i=1;i<n;i++) { if(height[i]<len) { down=up=sa[i]; } else { down=min(sa[i],down); up=max(sa[i],up); } if(up-down>len)return true; } return false;}int bin(){ int l=4,r=n,ans=0; while(l<=r) { int mid=(l+r)>>1; if(ok(mid)) { ans=mid,l=mid+1; } else r=mid-1; } return ans;}int main(){ while(scanf("%d",&n)!=EOF && n) { int m=0; scanf("%d",&str[0]); for(int i=1;i<n;i++) { scanf("%d",&str[i]); str[i-1]=str[i]-str[i-1]+90; m=max(str[i-1],m); } str[n-1]=0; suffix(m+1); getheight(); int res=bin(); res++; if(res<5)printf("0\n"); else printf("%d\n",res); } return 0;}/*101 2 3 4 5 6 7 8 9 10*/
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 1743 Musical Theme (后缀数组)
- POJ 1743Musical 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 后缀数组
- HDU 4496 D-City (并查集的应用)逆向思维
- js面对对象编程
- HDU 4496 D-City (并查集)
- uva 10537 - The Toll! Revisited (逆向思维+最短路+输出字典序最小路径)
- MVC5学习整理
- POJ 1743 Musical Theme (后缀数组)
- OpenCV学习笔记(4)——VS环境下调试遇到的问题整理(不断更新……)
- 门面模式---学习笔记
- ABAP-基础一
- 今日作息及食谱(6.29)
- 便捷的oh-my-zsh
- 60条有名的处世原则与定理
- 【Android开发经验】与屏幕亮度调节相关的各种方法整理
- 编程算法 - 数组中出现次数超过一半的数字 代码(C)