poj 3261 后缀数组 找反复出现k次的子串(子串能够重叠)
题目:http://poj.org/problem?id=3261
仍然是后缀数组的典型应用----后缀数组+lcp+二分
做的蛮顺的,1A
可是大部分时间是在调试代码。由于模板的全局变量用混了,而自己又忘了。,,等西安邀请赛还有四省赛结束之后,该冷静反思下尝试拜托模板了
错误 :1、k用错,题目的k和模板的k用混;
2、还是二分的C()函数,这个事实上跟前一篇《poj
1226 hdu 1238 Substrings 求若干字符串正串及反串的最长公共子串 2002亚洲赛天津预选题》的C函数写法差点儿相同。可是比那个简单,可是还是调了一会儿。,。開始的时候。没有记录ret,应该记录ret出现过的最大值
3、last>=kk-1才对,由于lcp[i]本身就是两个子串的公共前缀长度
int C(int x)
{
int ret=0,last=0;
for(int i=0;i<=n;i++)
{
if(lcp[i]>=x)ret++;
else
{ last=max(last,ret);
ret=0;
}
}
if(last>=kk-1)return 1;
else return 0;
}
上代码:
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm> using namespace std; const int MAXN = 20200; int rk[MAXN],sa[MAXN],s[MAXN],tmp[MAXN],lcp[MAXN],n,k,kk; bool cmpSa(int i,int j)
{
if(rk[i] != rk[j])return rk[i]<rk[j];
else
{
int ri = i+k<=n?rk[i+k]:-1;
int rj = j+k<=n?rk[j+k]:-1;
return ri<rj;
}
} void consa()
{
for(int i=0;i<=n;i++)
sa[i]=i,rk[i]=i<n?s[i]:-1;
for(k=1;k<=n;k*=2)
{
sort(sa,sa+n+1,cmpSa);
tmp[sa[0]]=0;
for(int i=1;i<=n;i++)
{
tmp[sa[i]]=tmp[sa[i-1]]+(cmpSa(sa[i-1],sa[i])?1:0);
}
for(int i=0;i<=n;i++)
rk[i]=tmp[i];
}
} void construct_lcp()
{
//n=strlen(s);
for(int i=0; i<=n; i++)rk[sa[i]]=i; int h=0;
lcp[0]=0;
for(int i=0;i<n;i++)
{
int j=sa[rk[i]-1]; if(h>0)h--;
for(; j+h<n && i+h<n; h++)
{
if(s[j+h]!=s[i+h])break;
}
lcp[rk[i]-1]=h;
}
} int C(int x)
{
int ret=0,last=0;
for(int i=0;i<=n;i++)
{
if(lcp[i]>=x)ret++;
else
{ last=max(last,ret);
ret=0;
}
}
if(last>=kk-1)return 1;
else return 0;
} int main()
{
//freopen("poj 3261.txt","r",stdin); while(scanf("%d%d",&n,&kk)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%d",&s[i]);
s[n]=-1;
consa();
construct_lcp();
int d=0,up=n+1,mid;
while(up>d+1)
{
mid=(d+up)/2;
if(C(mid))d=mid;
else up=mid;
}
printf("%d\n",d);
}
return 0;
}
poj 3261 后缀数组 找反复出现k次的子串(子串能够重叠)的更多相关文章
- POJ 3261 后缀数组
题目链接:http://poj.org/problem?id=3261 题意:约翰注意到奶牛产奶的之类是不断变化的,虽然他不能预测从当天到下一天的变化情况但是他知道变化是有规律的,牛奶的质量由一个整数 ...
- Milk Patterns POJ - 3261 后缀数组
Farmer John has noticed that the quality of milk given by his cows varies from day to day. On furthe ...
- POJ - 3261 后缀数组 height应用
题意:求最少重叠\(k\)次的重复子串的最大长度 子串长度问题依然是二分枚举,可以观察出重叠的一定是sa排序中连续的 之前想出一种判断要\(n^2\)的方法,没有考虑到后面肯定会连续出现的情况 (大概 ...
- poj 3261 后缀数组 可重叠的 k 次最长重复子串
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 16430 Accepted: 7252 Ca ...
- POJ 3261 (后缀数组 二分) Milk Patterns
这道题和UVa 12206一样,求至少重复出现k次的最长字串. 首先还是二分最长字串的长度len,然后以len为边界对height数组分段,如果有一段包含超过k个后缀则符合要求. #include & ...
- [poj 3261]后缀数组+滑窗最小值
题目链接:http://poj.org/problem?id=3261 这个是可以交叉的重复串,所以用height就可以了,但是题目说让重复k次以上,也就是直接做一个k-1长度的滑窗最小值,从这些最小 ...
- POJ 3261 后缀数组+二分
思路: 论文题- 二分+对后缀分组 这块一开始不用基数排序 会更快的(其实区别不大) //By SiriusRen #include <cstdio> #include <cstri ...
- poj 2774 后缀数组 两个字符串的最长公共子串
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 31904 Accepted: 12 ...
- POJ 3415 后缀数组
题目链接:http://poj.org/problem?id=3415 题意:给定2个串[A串和B串],求两个串公共子串长度大于等于k的个数. 思路:首先是两个字符串的问题.所以想用一个'#'把两个字 ...
随机推荐
- swift语言点评十四-继承
Overriding A subclass can provide its own custom implementation of an instance method, type method, ...
- JSON 字符串转换为 JavaScript 对象
将数据组合成json格式的字符串var text = '{ "sites" : [' + '{ "name":"Runoob" , &quo ...
- 洛谷 P1855 榨取kkksc03 (二维费用背包)
加多一维就行了 #include<cstdio> #include<algorithm> #include<cstring> #define REP(i, a, b ...
- SpringBoot实战(一)HelloWorld
一:环境准备: JDK:1.8版本 Maven:3.5版本(如果觉得下载速度慢,可以切换为阿里镜向地址) Intellij:2018.2.1版本 二:实际操作: 1.在Intellij中创建一个新的S ...
- python字典对象的update()方法
使用字典对象的update()方法,如A.update(B),将B字典的键值对一次性全部添加到A字典对象,当A字典为空时,相当于深复制,非常方便.如果两个字典中存在相同的键,则进行值的更新. A={} ...
- Android中设置半个屏幕大小且居中的button布局 (layout_weight属性)
先看例如以下布局 :
- Android OpenGL ES(七)----理解纹理与纹理过滤
1.理解纹理 OpenGL中的纹理能够用来表示图像.照片,甚至由一个数学算法生成的分形数据.每一个二维的纹理都由很多小的纹理元素组成.它们是小块的数据,类似于我们前面讨论过的片段和像素.要使用纹理,最 ...
- 蓝牙压力測试报抛android.os.TransactionTooLargeException异常分析总结
1.从main日志中找到异常点,例如以下: 08-20 11:05:19.754 5023 5023 E AndroidRuntime: FATAL EXCEPTION: main 08-20 11: ...
- linux系统调用表(system call table)
系统调用号 函数名 入口点 源码 0 read sys_read fs/read_write.c 1 write sys_write fs/read_write.c 2 open sys_open f ...
- bzoj1070: [SCOI2007]修车(费用流)
1070: [SCOI2007]修车 题目:传送门 题解: 一道挺简单的费用流吧...胡乱建模走起 贴个代码... #include<cstdio> #include<cstring ...