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的个数. 思路:首先是两个字符串的问题.所以想用一个'#'把两个字 ...
随机推荐
- ftp 一个账号多个家目录的解决方案
通常,配置ftp时,一个ftp账号只对应一个家目录,不能有多个家目录的情况. 但是,根据公司开发项目的需求,需要做到一个ftp对应多个开发目录.有想过创建软链接的,可是发现通过ftp是访问不了的. 举 ...
- 关闭linux终端进程
[root@linux-node1 ~]# w 22:16:45 up 24 days, 24 min, 2 users, load average: 0.28, 0.17, 0.15 USER TT ...
- java后台生成图片二维码
controller: /** * 获取登录的验证码 * @param request * @param response */ public void getLoginCode(HttpSessio ...
- nginx proxy_set_header设置,自定义header
在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断,或者统计ip访问次数等,通常情况下我们使用request.getRemoteAddr()就可以获取到客户端ip,但是当我们使用了ng ...
- 05004_Linux的其他命令和权限命令
1.其他命令 (1)显示当前所在位置 命令:pwd (2)搜索命令 a.命令:grep 要搜索的字符串 要搜索的文件 示例:搜索/etc/sudu.conf文件中包含字符串to的行 b.搜索/etc/ ...
- 洛谷 P2128 赤壁之战
P2128 赤壁之战 题目描述 赤壁之战,黄盖率舰满载薪草膏油诈降曹军. 受庞统所授的连环计,曹军战船之间由铁索相连,没有两艘战船在同一位置,也没有铁索两两相交或穿过战船.每艘船都有其一定的战略价值. ...
- UNIX环境高级编程之第4章:文件和文件夹-习题
4.1 stat函数是尾随符号链接的,所以用stat替换lstat不会显示符号链接的信息 4.2 在一个目录下先再shell中输入umask shell进程再进行创建文件的操作.其权限抖都会被屏蔽 4 ...
- bzoj1296: [SCOI2009]粉刷匠(DP)
1296: [SCOI2009]粉刷匠 题目:传送门 题解: DP新姿势:dp套dp 我们先单独处理每个串,然后再放到全局更新: f[i][k]表示当前串枚举到第i个位置,用了k次机会 F[i][j] ...
- lightoj--1155-- Power Transmission (最大流拆点)
Power Transmission Time Limit: 2000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu Sub ...
- 熟悉了下HTTP协议
HTML是一种用来定义网页的文本,会HTML,就可以编写网页: HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信.200表示一个成功的响应,后面的OK是说明.失败的响应有404 Not ...