[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 ...
随机推荐
- linux设置系统日期时间
设置当前日期: date -s 08/06/2015 设置当前时间:date -s 10:03:00 写入BIOS: clock -w 显示当前日期时间: date
- java通过http调用服务
package test; import java.io.IOException; import org.apache.commons.httpclient.Cookie; import org.ap ...
- 模型(modle)
MVC模式三:模型操作数据库,之后注册变量于模板,之后用控制器的dispaly()方法显示; 一.跨控制器调用方法 因为控制器的实质是类,所以在该方法中造一个要调用的类的对象,调用他的方法; 比如,在 ...
- linux crontab 实现每秒执行(转)
linux crontab 命令,最小的执行时间是一分钟.如需要在小于一分钟内重复执行,可以有两个方法实现. 1.使用延时来实现每N秒执行 创建一个php做执行动作,非常简单,就是把当前时间写入log ...
- 【linux】ps 命令详解
[root@andon lib]# ps aux ###常用格式 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0 ...
- IntelliJ IDEA修改Output输出缓存区大小【应对:too much output to process】
IntelliJ IDEA默认的Output输出缓存区大小只有1024KB,超过大小限制的就会被清除,而且还会显示[too much output to process],可通过如下配置界面进行修改O ...
- php接二进制文件
PHP默认只识别application/x-www.form-urlencoded标准的数据类型. 因此,对型如text/xml 或者 soap 或者 application/octet-stream ...
- Learning Puppet — Resources and the RAL
Learning Puppet — Resources and the RAL Welcome to Learning Puppet! This series covers the basics of ...
- EntityFramework ,ef 介绍
EntityFramework之领域驱动设计实践 分层架构 在引入实例以前,我们有必要回顾,并进一步了解分层架构.“层”是一种体系结构模式[POSA1],也是被广大软件从业人员用得最为广泛而且最为灵活 ...
- ADF_Advanced ADF系列2_Fusion应用的客制和个性化(Part2)
2015-02-17 Created By BaoXinjian