[ACDream 1430]SETI 后缀数组
题目链接:http://acdream.info/problem?pid=1430
题目大意:给你一个长度不超过10000的字符串,问你出现过两次或两次以上的不重叠的子串有多少个。
后缀数组计算出height数组出来,然后分组。
如果没有分在一组的话代表两个的前缀是不相同的。于是就可以暴力搞了。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
typedef long long LL; const int maxn = 1e5+;
int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
int sa[maxn],r[maxn];
int rank[maxn],height[maxn];
char s[maxn];
int cmp(int *r,int a,int b,int l){
return r[a]==r[b]&&r[a+l]==r[b+l];
} void da(int *r,int *sa,int n,int m){
int i,j,p,*x=wa,*y=wb,*t;
for(i=;i<m;i++) ws[i] = ;
for(i=;i<n;i++) ws[x[i]=r[i]]++;
for(i=;i<m;i++) ws[i]+= ws[i-];
for(i=n-;i>=;i--) sa[--ws[x[i]]] = i;
for(j=,p=;p<n;j*=,m=p){
for(p=,i=n-j;i<n;i++) y[p++] = i;
for(i=;i<n;i++) if(sa[i]>=j) y[p++] = sa[i]-j;
for(i=;i<n;i++) wv[i] = x[y[i]];
for(i=;i<m;i++) ws[i] = ;
for(i=;i<n;i++) ws[wv[i]]++;
for(i=;i<m;i++) ws[i]+=ws[i-];
for(i=n-;i>=;i--) sa[--ws[wv[i]]] = y[i];
for(t=x,x=y,y=t,p=,x[sa[]]=,i=;i<n;i++)
x[sa[i]] = cmp(y,sa[i-],sa[i],j)?p-:p++;
}
} void calheight(int *r,int *sa,int n){
int i,j,k=;
for(i=;i<=n;i++) rank[sa[i]]=i;
for(i=;i<n;height[rank[i++]]=k)
for(k?k--:,j=sa[rank[i]-];r[i+k]==r[j+k];k++);
} int main(){
gets(s);
int len = strlen(s);
for(int i=;i<len;i++){
r[i] = s[i] - 'a' + ;
}
da(r,sa,len+,);
calheight(r,sa,len);
// for(int i=1;i<=len;i++){
// printf("%d ",sa[i]);
// }
// puts("");
// for(int i=2;i<=len;i++) printf("%d ",height[i]); puts("");
int ans = ;
for(int k=;k<=len;k++){
int maxn = sa[] , minn = sa[];
int q = ;
// printf("now k=%d\n",k);
for(int i=;i<=len+;i++){
if( height[i]<k||i==len+ ){
if( maxn-minn>=k ) ans++;
maxn = minn = sa[i];
// printf("i=%d sa[i]=%d maxn = %d minn = %d\n",i,sa[i],maxn,minn);
} else if(i<=len){
maxn = max(sa[i],maxn);
minn = min(sa[i],minn);
}
}
// printf("k=%d q=%d\n",k,q);
// q = 0;
}
printf("%d\n",ans);
return ;
}
[ACDream 1430]SETI 后缀数组的更多相关文章
- acdream 1430 SETI 后缀数组+height分组
这题昨天比赛的时候逗了,后缀想不出来,由于n^2的T了,就没往后缀数组想--并且之后解题的人又说用二分套二分来做.然后就更不会了-- 刚才看了题解,唉--原来题讲解n^2的也能够过,然后就--这样了! ...
- ACdream 1430——SETI——————【后缀数组,不重叠重复子串个数】
SETI Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statist ...
- 后缀数组的倍增算法(Prefix Doubling)
后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- POJ3693 Maximum repetition substring [后缀数组 ST表]
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9458 Acc ...
- POJ1743 Musical Theme [后缀数组]
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 27539 Accepted: 9290 De ...
- 后缀数组(suffix array)详解
写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...
- 【UOJ #35】后缀排序 后缀数组模板
http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...
随机推荐
- oracle11g服务项及其启动顺序
oracle安装完成后共七个服务,含义分别为: 1. Oracle ORCL VSS Writer Service:Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Ser ...
- SourceInsight支持Python代码阅读
这个话题,很简单,主要是要有一个插件Python.CLF,这个文件可以从我的GitHub上下载.然后,参照下面的图片显示的步骤,就很快搞定! 具体的步骤,看下面的三张图片,顺序编号了,从1到9,对照着 ...
- http meta
定义和用法 <meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. <meta> 标签位于文档的头部,不包含任 ...
- Struts2 Interceptors
Alias Interceptor : 别名拦截器 <action name="someAction" class="com.examples.SomeAction ...
- C#与JAVA平台RSA算法交互示例
很久以前的文章中,演示了如何对于.net和win32下面的delphi的RSA互操作性的实现,对于C#和JAVA之前的RSA加密解密也是很简单的,一般都采用了标准的规范,所以在互操作性方面是很方便的. ...
- 真实赛车3,SPEEDRUSH TV 第3季,第3阶段(第3天),直线加速赛
与其跳过,不如金币升级引擎和车身.因为后边紧跟一场计时赛.
- js setTimeout
setTimeout用法 //每个0.5秒钟改变字体和背景颜色,字体一闪一闪的效果 var flag = 0; function start(){ var text = document.getEle ...
- IIS SMTP status codes
Here are the meaning of SMTP status codes. Status Code Description 211 System status, or system help ...
- android学习笔记五——AutoCompleteTextView
AutocompleteTextview ==> 使用比较容易,只需要为其设置一个Adapter,该Adapter封装其需要预设的文本内容. 如下所示实例: <RelativeLayout ...
- [tty与uart]stty命令使用
中文解释链接:http://linux.51yip.com/search/stty 英文解释链接:http://pubs.opengroup.org/onlinepubs/9699919799/uti ...