●BZOJ 2251 [2010Beijing Wc]外星联络
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=2251
题解:
后缀数组,倍增,RMQ
题意:把重复次数超过 1次的子串按字典序输出它们重复的次数。
构建后缀数组,得到 height[]
按排名从小到大枚举每个后缀 i,
考虑它产生的之前没有出现过的子串是否重复次数大于1次。
用到倍增(不想写二分)求出:
包含 i的最大[l,r]范围使得这个范围内的后缀与 i后缀的 LCP大于当前判断的子串的长度。
然后把合法的子串的重复次数输出即可。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 3500
#define filein(x) freopen(#x".in","r",stdin);
#define fileout(x) freopen(#x".out","w",stdout);
using namespace std;
char S[MAXN];
int sa[MAXN],rak[MAXN],hei[MAXN],L[MAXN],R[MAXN],stm[MAXN][20],log2[MAXN];
void build(int N,int M){
static int cc[MAXN],ta[MAXN],tb[MAXN],*x,*y,h,p;
x=ta; y=tb; h=0;
for(int i=0;i<M;i++) cc[i]=0;
for(int i=0;i<N;i++) cc[x[i]=S[i]]++;
for(int i=1;i<M;i++) cc[i]+=cc[i-1];
for(int i=N-1;i>=0;i--) sa[--cc[x[i]]]=i;
for(int k=1;p=0,k<N;k<<=1){
for(int i=N-k;i<N;i++) y[p++]=i;
for(int i=0;i<N;i++) if(sa[i]>=k) y[p++]=sa[i]-k;
for(int i=0;i<M;i++) cc[i]=0;
for(int i=0;i<N;i++) cc[x[y[i]]]++;
for(int i=1;i<M;i++) cc[i]+=cc[i-1];
for(int i=N-1;i>=0;i--) sa[--cc[x[y[i]]]]=y[i];
swap(x,y); y[N]=-1; x[sa[0]]=0; M=1;
for(int i=1;i<N;i++)
x[sa[i]]=y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k]?M-1:M++;
if(M>=N) break;
}
for(int i=0;i<N;i++) rak[sa[i]]=i;
for(int i=0,j;i<N;i++){
if(h) h--;
if(rak[i]){
j=sa[rak[i]-1];
while(S[i+h]==S[j+h]) h++;
}
stm[rak[i]][0]=hei[rak[i]]=h;
}
for(int k=1;k<=log2[N];k++)
for(int i=(1<<k)-1;i<N;i++)
stm[i][k]=min(stm[i-(1<<(k-1))][k-1],stm[i][k-1]);
}
int LCP(int l,int r){
static int k;
if(l>r) swap(l,r); l++;
k=log2[r-l+1];
return min(stm[l+(1<<k)-1][k],stm[r][k]);
}
int find(int p,int lim,int x,int N){
int pos=p;
for(int k=log2[N],pp;k>=0;k--){
pp=pos+x*(1<<k);
if(pp<0||pp>=N) continue;
if(LCP(p,pp)<lim) continue;
pos=pp;
}
return pos;
}
int solve(int N){
for(int i=0,l,r;i<N;i++)
for(int j=hei[i]+1;sa[i]+j-1<N;j++){
l=find(i,j,-1,N);
r=find(i,j,1,N);
if(r-l+1>1) printf("%d\n",r-l+1);
if(l==r) break;
}
}
int main()
{
int N;
log2[1]=0; for(int i=2;i<=3000;i++) log2[i]=log2[i>>1]+1;
scanf("%d %s",&N,S);
build(N,300);
solve(N);
return 0;
}
●BZOJ 2251 [2010Beijing Wc]外星联络的更多相关文章
- bzoj 2251: [2010Beijing Wc]外星联络 后缀数组
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 424 Solved: 232[Submit][ ...
- BZOJ 2251: [2010Beijing Wc]外星联络
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 795 Solved: 477[Submit][ ...
- bzoj 2251: [2010Beijing Wc]外星联络【SA】
先求SA,然后按字典序从小到大枚举子串,每到一个后缀从长到短枚举子串(跳过长为he[i]的和前一段重复的子串),然后维护一个点p,保证i~p之间最小的he>=当前枚举长度,p是单调向右移的 然后 ...
- 2251: [2010Beijing Wc]外星联络
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 801 Solved: 481[Submit][ ...
- 2251. [2010Beijing Wc]外星联络【后缀数组】
Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻 找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星 人发来的信 ...
- 【BZOJ2251】[2010Beijing Wc]外星联络 后缀数组
[BZOJ2251][2010Beijing Wc]外星联络 Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是, ...
- BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组
BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组 Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻 找外星人的 ...
- [bzoj2251][2010BeiJing Wc]外星联络_后缀数组
外星联络 bzoj-2251 2010-BeiJing Wc 题目大意:题目链接. 注释:略. 想法: 这咋做啊????一看数据范围才$3\cdot 10^3$. 建立后缀数组. 所以我们将所有后缀排 ...
- BZOJ2251 [2010Beijing Wc]外星联络 后缀数组 + Height数组
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in", "r", stdin ...
随机推荐
- AWS中,如果使用了ELB,出现outofservice
平台:亚马逊AWS EC2 出现状况: 我创建了弹性平衡负载,也注册了实例,但是实例的状态一直是outofservice.为什么? 为什么会出现这个问题呢? 1:实例有问题: 2:负载平衡器创建的有问 ...
- 关于webService发布的wsdl中的import问题解决
大家都知道jdk1.6及以后都支持了对webService的原生态的支持:它在发布时会生成一个wsdl和一个xsd(一个类只生成一个xsd)所以就保留了引用关系,如下: <?xml versio ...
- Angular.js 1++快速上手
AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Goole所收购.是一款优秀的前端JS框架.AngularJS有着诸多特性,最为核心的是:MVC,撗块化,自动化双向数据绑 ...
- javascript中的数组对象
1.创建数组的三种方式: 1.1 var 数组名=[元素1,元素2,元素3...]; 例如: var arr1=[1,2,3,4]; 1.2 var 数组名=new Array(元素1,元素2,元素3 ...
- Ubuntu16.04建立本地更新源
公司有多台Ubuntu机器,而且不能连接互联网,导致安装软件和更新都比较麻烦,需要建立一台本地更新源服务器. 1.安装apt-mirror工具 sudo apt-get install -y apt- ...
- Codeforces 343D WaterTree - 线段树, DFS序
Description Translated by @Nishikino_Maki from Luogu 行吧是我翻的 Mad scientist Mike has constructed a roo ...
- python之集合,深浅copy
一. 集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...
- python--同步锁/递归锁/协程
同步锁/递归锁/协程 1 同步锁 锁通常被用来实现对共享资源的同步访问,为每一个共享资源创建一个Lock对象,当你需需要访问该资源时,调用acquire()方法来获取锁对象(如果其他线程已经获得了该锁 ...
- TR069网管协议应用在Android系统开发的前言
随着智能平台的终端设备不断发展,迫切需要我们解决这些终端的管理问题,而现有的终端统一管理平台已经成熟,主要是基于tr069协议网管平台,比如华为的itms等终端管理平台.所以,这篇文章就是为了实现一种 ...
- hdu-2141 Can you find it?---暴力+二分
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2141 题目大意: 给ABC三个数组,给一个X,求是否存在Ai+Bj+Ck = X 思路: 等式转化成 ...