题意:给出一串长度为n的字符,再给出一个k值,要你求重复次数大于等于k次的最长子串长度........

思路:其实也非常简单,直接求出height值,然后将它分组,二分答案......结果就出来了.......

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxx 110000
int wa[maxx],wb[maxx],wsf[maxx],wv[maxx];
int sa[maxx],rank[maxx],s[maxx],height[maxx];
struct node
{
int num,x;
}str[maxx];
int cmp1(const node a,const node b)
{
if(a.x<b.x)
return 1;
else
return 0;
}
int cmp(int *r,int a,int b,int k)
{
return r[a]==r[b]&&r[a+k]==r[b+k];
}
void getsa(int *r,int *sa,int n,int m)
{
int i,j,p,*x=wa,*y=wb,*t;
for(i=0;i<m;i++) wsf[i]=0;
for(i=0;i<n;i++) wsf[x[i]=r[i]]++;
for(i=1;i<m;i++) wsf[i]+=wsf[i-1];
for(i=n-1;i>=0;i--) sa[--wsf[x[i]]]=i;
j=1;
p=1;
for(;p<n;j*=2,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++) wsf[i]=0;
for(i=0;i<n;i++) wsf[wv[i]]++;
for(i=1;i<m;i++) wsf[i]+=wsf[i-1];
for(i=n-1;i>=0;i--) sa[--wsf[wv[i]]]=y[i];
t=x;
x=y;
y=t;
x[sa[0]]=0;
for(p=1,i=1;i<n;i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
}
}
void getheight(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;i++)
{
if(k)
k--;
else
k=0;
j=sa[rank[i]-1];
while(r[i+k]==r[j+k])
k++;
height[rank[i]]=k;
}
}
int deal(int n,int mid,int k)
{
int flag=1; //要注意,初始值是1.....应该一个height值,是两个字符的lcp,i与i-1的....所以初始值应该从1开始....
for(int i=2;i<=n;i++)
{
if(height[i]>=mid)
{
flag++;
if(flag>=k)
return 1;
}
else flag=1;
}
return 0;
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)>0)
{
int zd=0;
for(int i=0;i<n;i++)
{
scanf("%d",&str[i].x);
str[i].num=i;
}
sort(str,str+n,cmp1);
int j=1;
s[str[0].num]=j;
for(int i=1;i<n;i++)
{
if(str[i].x==str[i-1].x)
s[str[i].num]=j;
else
{
j++;
s[str[i].num]=j;
}
}
s[n]=0;
//for(int i=0;i<n;i++)
//printf("%d ",s[i]);
getsa(s,sa,n+1,j+10);
getheight(s,sa,n);
int left=0,right=n,count=0,mid;
while(left<=right)
{
mid=(left+right)/2;
if(deal(n,mid,k))
{
if(count<mid)
count=mid;
//printf("%d\n",mid);
left=mid+1;
}
else right=mid-1;
}
printf("%d\n",count);
}
return 0;
}

poj3261(后缀数组)的更多相关文章

  1. POJ3261(后缀数组+2分枚举)

    Milk Patterns Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 12972   Accepted: 5769 Ca ...

  2. poj3261 后缀数组求重复k次可重叠的子串的最长长度

    Milk Patterns Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 13669   Accepted: 6041 Ca ...

  3. poj3261 Milk Patterns 后缀数组求可重叠的k次最长重复子串

    题目链接:http://poj.org/problem?id=3261 思路: 后缀数组的很好的一道入门题目 先利用模板求出sa数组和height数组 然后二分答案(即对于可能出现的重复长度进行二分) ...

  4. POJ3261 Milk Patterns 【后缀数组】

    牛奶模式 时间限制: 5000MS   内存限制: 65536K 提交总数: 16796   接受: 7422 案件时间限制: 2000MS 描述 农夫约翰已经注意到,他的牛奶的质量每天都在变化.经进 ...

  5. 【BZOJ1717&POJ3261】Milk Patterns(后缀数组,二分)

    题意:求字符串的可重叠的k次最长重复子串 n<=20000 a[i]<=1000000 思路:后缀数组+二分答案x,根据height分组,每组之间的height>=x 因为可以重叠, ...

  6. POJ3261 Milks patterns(后缀数组)

    Farmer John has noticed that the quality of milk given by his cows varies from day to day. On furthe ...

  7. 【距离GDOI:131天】 后缀数组完毕

    用了近两周的时间,终于把罗神那篇后缀数组应用看完了,题目也写了一遍,T了无数次...详见前几篇博文... 后缀数组很重要的是那个height数组,可以用来做各种奇奇怪怪的东西...常用方法去是去二分, ...

  8. 后缀数组基本问题QAQ

    以下题目均来自罗穗骞的论文... No.1最长公共前缀 最长公共前缀: 题目: 给定一个字符串,询问某两个后缀的最长公共前缀. 分析: 某两个后缀的最长公共前缀就是区间height最小值,转化为RMQ ...

  9. 后缀数组练习2:可重叠的k次最长重复子串

    其实和上一题是差不多的,只是在二分check的时候有一些小小的改动 1468: 后缀数组2:可重叠的k次最长重复子串 poj3261 时间限制: 1 Sec  内存限制: 128 MB提交: 113  ...

  10. 后缀数组的倍增算法(Prefix Doubling)

    后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...

随机推荐

  1. 《纵向切入ASP.NET 3.5控件和组件开发技术》笔记:高效率事件集合对象

    在之前讲的几个例子中,使用的是最普通的定义事件方法,比如KingTextBox中事件是这样定义的:/// <summary>/// 获得本书更多内容,请看:/// http://blog. ...

  2. XMPPFrameWork IOS 开发(四)消息和好友上下线

    原始地址:XMPPFrameWork IOS 开发(四) 消息 //收到消息 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XM ...

  3. (剑指Offer)面试题54:表示数值的字符串

    题目: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.14 ...

  4. WCF 之 已知类型(KnownType)

    已知类型(Known types)允许在服务契约中使用多态的行为,在服务操作中暴露基本类型.将已知类型(known types)相关到基本类型(基类类型)自身;特定操作;整个服务契约采用属性声明或者配 ...

  5. Creating a Unity Game for Windows 8

    原地址:http://www.davebost.com/2013/08/30/creating-a-unity-game-for-windows-8 The recent release of Uni ...

  6. QtGui.QBrush

    The QtGui.QBrush is an elementary graphics object. It is used to paint the background of graphics sh ...

  7. Think in Java(二):初始化与清理

    1. 区分重载方法: 參数顺序的不同能够区分两个方法,只是,普通情况下千万别这么做.由于这会使代码难以维护不能通过返回值类型来区分重载方法:由于假设我直接调用f(), 此时java不知道应该调用那一个 ...

  8. jquery 获取html <img /> 位置时出错问题

    如图所示,这样端口小图片都是通过jquery html()方法设置的(参数html就是画整个图片的html字符串),如图: 但是出现图片没有完全渲染完的问题,如图: 从图中可以看出在代码运行到断点的时 ...

  9. mysql优化三

    1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一 ...

  10. STS IDE 个性化修改

    JDK: Eclipse或MyEclipse文件系统不同步的解决方法 STS汉化: 1.解压STS中的language文件夹 以我的安装目录为例,我的STS的安装在D:盘下.将解压后的“languag ...