[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 ...
随机推荐
- Junit手动/自动加载spring配置文件
分配置文件在classpath下和web-inf下两种情况的加载: ApplicationContext context = new FileSystemXmlApplicationContext(& ...
- Android 不同文件名介绍
Android 不同文件名介绍
- SQL开发利器SQL Prompt
SQL开发利器SQL Prompt 5.1完全破解+使用教程 - keepfool - 博客园 http://www.cnblogs.com/keepfool/archive/2012/05/27/2 ...
- [转]使用 Minidumps 和 Visual Studio .NET 进行崩溃后调试
本文关键字:Minidumps, Windows, SEH, VisualC, .NET 摘要 本文讲述了 minidumps 是怎样工作的.当你的程序崩溃的时候应该如何生成它们.以及如何在 Visu ...
- asp.net get App_Data 目录几种方法 path
方法一 //ASP.NET MVC1 -> MVC3 string path = HttpContext.Current.Server.MapPath("~/App_Data/some ...
- bzoj2734 集合选数
Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...
- 解读Nodejs多核处理模块cluster
来源: http://blog.fens.me/nodejs-core-cluster/ 从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发. ...
- mysql 学习笔记(一)
查询:show databases; show status; show tables; desc table-name: 更改root密码:方法一:mysqladmin -uroot -poldp ...
- ios8 ios7 tableview cell 分割线左对齐
ios8中左对齐代码 //加入如下代码 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cel ...
- for语句的用法
#!/bin/bashfor i in 1 2 3 4 5 6do echo $idone 看文件 #!/bin/bashdir=$(ls /etc) for i in $dirdo echo $id ...