博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3261 后缀数组 找反复出现k次的子串(子串能够重叠)
阅读量:6969 次
发布时间:2019-06-27

本文共 1172 字,大约阅读时间需要 3 分钟。

题目:http://poj.org/problem?id=3261

仍然是后缀数组的典型应用----后缀数组+lcp+二分

做的蛮顺的,1A

可是大部分时间是在调试代码。由于模板的全局变量用混了,而自己又忘了。,,等西安邀请赛还有四省赛结束之后,该冷静反思下尝试拜托模板了

错误   :1、k用错,题目的k和模板的k用混;

2、还是二分的C()函数,这个事实上跟前一篇《》的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 
#include
#include
#include
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]
0)h--; for(; j+h
=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
d+1) { mid=(d+up)/2; if(C(mid))d=mid; else up=mid; } printf("%d\n",d); } return 0;}

转载于:https://www.cnblogs.com/clnchanpin/p/6978075.html

你可能感兴趣的文章
JSP页面中使用JSTL标签出现无法解析问题解决办法
查看>>
【Apache开源软件基金会项目】
查看>>
〖Linux〗让Kubuntu的“启动栏”与Win7“任务栏”的界面和功能一样
查看>>
COM口总是有惊叹号怎么办
查看>>
[翻译] HTKDragAndDropCollectionViewLayout
查看>>
一步一步写算法(之链表重合)
查看>>
推荐12个最好的 JavaScript 图形绘制库
查看>>
关于Git的merge和rebase命令解析
查看>>
1.1 合用weightSum属性和layout_weight属性
查看>>
微软职位内部推荐-Senior Software Engineer
查看>>
------------数据库的加锁操作(上)
查看>>
关于JS APP
查看>>
来,试试PERL
查看>>
Readprocessmemory使用方法
查看>>
HDU 5154 Harry and Magical Computer bfs
查看>>
jquerymobile知识点:select的动态帮定
查看>>
Valgrind 内存泄漏工具
查看>>
【Cocos2d-Js实战教学(1)横版摇杆八方向移动】
查看>>
Android ScrollView中的组件设置android:layout_height="fill_parent"不起作用的解决办法
查看>>
CvMat and cv::Mat
查看>>