[POJ1743]Musical Theme 做题笔记
来源:互联网 发布:网络教育拿学位证书 编辑:程序博客网 时间:2024/05/18 01:07
题目链接:http://poj.org/problem?id=1743
后缀数组+二分答案,可以看一下罗神的《后缀数组——处理字符串的有力工具》
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N=20050;int n,num[N];int sa[N],rank[N],height[N];int wa[N],wb[N],wv[N],wd[N];int cmp (int *r,int a,int b,int l) { return r[a]==r[b] && r[a+l]==r[b+l];}void da (int *r,int *sa,int n,int m) { int i,j,p,*x=wa,*y=wb,*t; for (i=0;i<m;i++) wd[i]=0; for (i=0;i<n;i++) wd[x[i]=r[i]]++; for (i=1;i<m;i++) wd[i]+=wd[i-1]; for (i=n-1;i>=0;i--) sa[--wd[x[i]]]=i; for (j=1,p=1;p<n;j<<=1,m=p) { for (p=0,i=n-j;i<n;i++) y[p++]=i; for (i=0;i<n;i++) if (sa[i]>=j) y[p++]=sa[i]-j; for (i=0;i<n;i++) wv[i]=x[y[i]]; for (i=0;i<m;i++) wd[i]=0; for (i=0;i<n;i++) wd[wv[i]]++; for (i=1;i<m;i++) wd[i]+=wd[i-1]; for (i=n-1;i>=0;i--) sa[--wd[wv[i]]]=y[i]; for (t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; }}void calheight (int *r,int *sa,int n) { int i,j,k=0; for (i=1;i<=n;i++) rank[sa[i]]=i; for (i=0;i<n;height[rank[i++]]=k) for (k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);}bool valid(int len) { int i=2,ma,mi; while (1) { while (i<=n&&height[i]<len)i++; if (i>n) break; ma=sa[i-1],mi=sa[i-1];//为什么是i-1?因为height[i]储存的是suffix[sa[i]]和suffix[sa[i-1]]的lcp while (i<=n&&height[i]>=len) { ma=max(ma,sa[i]); mi=min(mi,sa[i]); i++; } if (ma-mi>=len) return 1; } return 0;}int main () { int ans; while (scanf("%d",&n) && n!=0) { for (int i=0;i<n;i++) scanf("%d",&num[i]); if (n<10) { puts("0"); continue; } n--; for (int i=0;i<n;i++) num[i]=num[i+1]-num[i]+89; num[n]=0; da(num,sa,n+1,200); calheight(num,sa,n); int l=1,r=n,mid;//? while (l<r) { mid=(l+r+1)>>1; if (valid(mid)) l=mid; else r=mid-1; } ans=l<4?0:l+1; printf("%d\n",ans); } 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
- sudo -i 免密码 sudo -i 使用不了
- c++第1次实验(三角形)
- 购物车架构 一:添加商品到购物车
- ViewConfiguration 介绍
- 第二次作业
- [POJ1743]Musical Theme 做题笔记
- RecyclerView ViewHolder getAdapterPotition return NO_POSITION!
- 计算时间和空间复杂度
- Android程序设计:快速录音小程序
- Jetbrains IDE Crack V2.1使用方法
- javascript 基础3
- 对经典算法百鸡百钱问题的优化解决,使其时间复杂度为n。
- exit 与 _exit的区别
- mysql执行效率优化注意事项及要点