poj 3261 Milk Patterns
来源:互联网 发布:volte网络分为终端 编辑:程序博客网 时间:2024/06/06 19:28
求重复至少k次的最长子串。后缀数组排序,那么sa[]里面连续的k个,求k个的最长子串长度。这里用到height[]数组求,k个的最长子串长度就是height[]里面连续k-1个的最小值,那么这些最小值里面取个最大值就是ans了。
#include <iostream>#include <string.h>#include <algorithm>#include <stdlib.h>#include <stdio.h>using namespace std;const int maxn=20000+5;int sa[maxn];int t1[maxn],t2[maxn],c[maxn];int r[maxn],height[maxn];void build_sa(int s[],int n,int m){ int i,j,p,*x=t1,*y=t2; //第一轮基数排序,如果s的最大值很大,可改为快速排序 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(j=1;j<=n;j<<=1) { p=0; //直接利用sa数组排序第二关键字 for(i=n-j;i<n;i++)y[p++]=i;//后面的j个数第二关键字为空的最小 for(i=0;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j; //这样数组y保存的就是按照第二关键字排序的结果 //基数排序第一关键字 for(i=0;i<m;i++)c[i]=0; for(i=0;i<n;i++)c[x[y[i]]]++; for(i=1;i<m;i++)c[i]+=c[i-1]; for(i=n-1;i>=0;i--)sa[--c[x[y[i]]]]=y[i]; //根据sa和x数组计算新的x数组 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]+j]==y[sa[i]+j]?p-1:p++; if(p>=n)break; m=p;//下次基数排序的最大值 }}void getHeight(int s[],int n){ int i,j,k=0; for(i=0;i<=n;i++)r[sa[i]]=i; for(i=0;i<n;i++) { if(k)k--; j=sa[r[i]-1]; while(s[i+k]==s[j+k])k++; height[r[i]]=k; }}int s[maxn];int a[maxn];int deq[maxn];int main(){ int n,k; while(~scanf("%d%d",&n,&k)){ for(int i=0;i<n;i++){ scanf("%d",&s[i]); a[i]=s[i]; } sort(a,a+n); int len=unique(a,a+n)-a; for(int i=0;i<n;i++){ s[i]=lower_bound(a,a+len,s[i])-a+1;//printf("s==%d\n",s[i]); } s[n]=0; build_sa(s,n+1,maxn-3); getHeight(s,n); int ans=0; int s=2,t=2; for(int i=2;i<=n;i++){ while(s<t&&height[deq[t-1]]>=height[i])t--; deq[t++]=i; if(i-2+1>=k-1){ ans=max(ans,height[deq[s]]); if(deq[s]==i-(k-1)+1)s++; } } printf("%d\n",ans); } return 0;}
0 0
- poj 3261 Milk Patterns
- poj 3261 Milk Patterns
- POJ 3261 Milk Patterns
- poj 3261 Milk Patterns
- Milk Patterns POJ 3261
- POJ-3261-Milk Patterns
- POJ 3261 Milk Patterns
- poj-3261-Milk Patterns
- POJ 3261 Milk Patterns
- poj 3261 Milk Patterns
- POJ 3261 Milk Patterns
- poj 3261 : Milk Patterns
- poj 3261 Milk Patterns
- POJ 3261 Milk Patterns
- POJ 3261 Milk Patterns
- [POJ 3261]Milk Patterns
- POJ 3261 Milk Patterns
- POJ 3261Milk Patterns
- CentOS/Linux 端口开放关闭管理
- iOS对接Facebook:登录,分享,邀请,游戏排行榜功能
- 关于DefaultHttpClient 过时的问题
- 指定任意灰度变换
- Prism框架(二)——Prism应用程序初始化
- poj 3261 Milk Patterns
- 《组合变身小宠物游戏》GameFSM(修改更新中)【初学者】
- 【转】R语言异常检测处理
- 开篇
- 设计模式之UML类图
- Prism框架(三)——基于模块的应用程序开发
- HD--1596 find the safest road
- 初学Unity3D-苏拉卡尔塔棋界面
- C++实现线索二叉树 -- 创建遍历查找等操作