题目链接: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 后缀数组的更多相关文章

  1. acdream 1430 SETI 后缀数组+height分组

    这题昨天比赛的时候逗了,后缀想不出来,由于n^2的T了,就没往后缀数组想--并且之后解题的人又说用二分套二分来做.然后就更不会了-- 刚才看了题解,唉--原来题讲解n^2的也能够过,然后就--这样了! ...

  2. ACdream 1430——SETI——————【后缀数组,不重叠重复子串个数】

    SETI Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statist ...

  3. 后缀数组的倍增算法(Prefix Doubling)

    后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...

  4. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  5. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

  6. POJ3693 Maximum repetition substring [后缀数组 ST表]

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Acc ...

  7. POJ1743 Musical Theme [后缀数组]

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 27539   Accepted: 9290 De ...

  8. 后缀数组(suffix array)详解

    写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...

  9. 【UOJ #35】后缀排序 后缀数组模板

    http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...

随机推荐

  1. AR增强现实特点、关键技术和应用

    http://wenku.baidu.com/link?url=ABXxm5yezMIQRJUV7XvNWUe_QpUUdpQ3IxGRpYUa760iex1_bygCcTBvEhCMvrdLAmSX ...

  2. 【转载】springMVC表单校验+全注解

    在这篇文章中,我们将学习如何使用Spring表单标签, 表单验证使用 JSR303 的验证注解,hibernate-validators,提供了使用MessageSource和访问静态资源(如CSS, ...

  3. 查看SQL执行计划

    一用户进入某界面慢得要死,查看SQL执行计划如下(具体SQL语句就不完全公布了,截断的如下): call     count       cpu    elapsed       disk       ...

  4. 支付宝客户端支付配置RSA公钥的问题错误,导致收不到回发通知

    没收到通知的原因是你们的商户公钥上传地址弄错了,应该上传到合作伙伴管理,您上传到无线wap哪里了,把您的公钥,从无线wap哪里复制贴到合作伙伴管理即可

  5. LINQ to SQL语句

    http://kb.cnblogs.com/page/42477/2/ 本系列文章导航 LINQ to SQL语句(1)之Where LINQ to SQL语句(2)之Select/Distinct ...

  6. [Hibernate] - Annotations - One To Many

    Hibernate使用Annotation的一对多: hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8&q ...

  7. 【freemaker】之FreeMakerUtil工具类

    Freemaker生成文件常用工具类 public class FreemakerUtil { private static FreemakerUtil util; private static Co ...

  8. android中的数据库操作

    如何在android中调用数据库资源 在android中主要有两种方法来实现对数据库的访问,一种是adb shell方式,另一种是通过相关的android 的java类来间接的对数据库来进行操作.其中 ...

  9. PL/SQL中查看列注释、列属性

  10. GL_GL系列 - 总账系统基础(概念)

    2014-07-07 Created By BaoXinjian