题目: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;
}

最新文章

  1. 据说年薪30万的Android程序员必须知道的帖子
  2. 基于.NET C#的 sqlite 数据库 ORM 【Easyliter】
  3. 让eclipse启动时拥有jre
  4. SQL SERVER 生成ORACLE建表脚本
  5. mongodb修改器
  6. 1093. Count PAT&#39;s (25)
  7. 【.net】创建属于自己的log组件——改进版
  8. DPDK2.1 linux上开发入门手册
  9. Android-兼容问题
  10. JSONP的客户端的具体实现
  11. Python 模块的一般处理
  12. grivid中切换按钮,两个按钮交替
  13. iOS推送服务细节回顾
  14. BZOJ 1875: [SDOI2009]HH去散步(矩阵乘法)
  15. [js高手之路]设计模式系列课程-发布者,订阅者重构购物车
  16. Nginx(二)-服务模式运行nginx之WINSW
  17. 微信硬件平台(八) 3-0ESP8266向微信服务器请求设备绑定的用户
  18. javap指令
  19. datatable 列名重新排序
  20. ICPC World Finals 2019 题解

热门文章

  1. RocketMQ学习笔记(3)----RocketMQ物理结构和逻辑部署结构
  2. 字符串的格式化(转自武sir)
  3. POJ-2253 Frogger dijsktra查找间隔最小的路径
  4. BZOJ 4103 [Thusc 2015]异或运算 (可持久化01Trie+二分)
  5. FTP 无法获取目录列表的处理方法
  6. hdoj Let the Balloon Rise
  7. [POJ2728] Desert King 解题报告(最优比率生成树)
  8. Codeforces 708D 费用流 (呃我们的考试题)
  9. java9新特性-1-概述
  10. IT男送什么礼物给女朋友呢?