题意:求字符串中不重叠的出现至少2次的子串个数。如aaaa 子串有a aa,2个。

普通的求出height[]数组,然后枚举所有的长度差。

对于"baba"

i   height[i]     串

1      0    a

2      1    aba

3      0    ba

4  2    baba

对于可能的k(满足的差),从1开始枚举。对于k=1时,下面的ba baba也是满足的,所以不能直接返回。而是要在不同k的时候计算。

#include<iostream>
#include <string.h>
#include<stdlib.h>
#define LL long long
using namespace std;
#define maxn 1020
int max(int x,int y)
{return x>y?x:y;}
int min(int x,int y)
{return x<y?x:y;}
int wa[maxn],wb[maxn],wv[maxn],WS[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=0;i<m;i++) WS[i]=0;for(i=0;i<n;i++) WS[x[i]=r[i]]++;for(i=1;i<m;i++) WS[i]+=WS[i-1];for(i=n-1;i>=0;i--) sa[--WS[x[i]]]=i;for(j=1,p=1;p<n;j*=2,m=p){for(p=0,i=n-j;i<n;i++) y[p++]=i;for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;for(i=0;i<n;i++) wv[i]=x[y[i]];for(i=0;i<m;i++) WS[i]=0;for(i=0;i<n;i++) WS[wv[i]]++;for(i=1;i<m;i++) WS[i]+=WS[i-1];for(i=n-1;i>=0;i--) sa[--WS[wv[i]]]=y[i];for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;}return;
}
int Rank[maxn],height[maxn];
void calheight(int *r,int *sa,int n)
{int i,j,k=0;for(i=1;i<=n;i++) Rank[sa[i]]=i;for(i=0;i<n;height[Rank[i++]]=k)for(k?k--:0,j=sa[Rank[i]-1];r[i+k]==r[j+k];k++);return;
}
int r[maxn],sa[maxn];
char s[maxn];
int ok(int k,int n)
{int i,j,ret=0;int maxx,minx;maxx=-1;minx=9999999;for(i=1;i<=n;i++){if(height[i]>=k)//分组满足大于k的
        {maxx=max(maxx,sa[i]);minx=min(minx,sa[i]);}else {if(maxx-minx>=k)//之前满足条件就要+1;ret++;maxx=sa[i];minx=sa[i];}}if(maxx-minx>=k)ret++;return ret;
}
int main()
{int i,j;while(cin>>s){if(s[0]=='#')break;int len=strlen(s);for(i=0;i<len;i++)r[i]=s[i];r[len]=0;da(r,sa,len+1,123);calheight(r,sa,len);LL ans=0;for(i=1;i<len;i++){ans+=ok(i,len);}/*for(i=0;i<=len;i++){printf("%d %d\n",height[i],sa[i]);}*/cout<<ans<<endl;}
}

转载于:https://www.cnblogs.com/sweat123/p/4793263.html

hdu3518 后缀数组相关推荐

  1. 寻找一个字符串的重复子串 后缀数组

    什么是后缀数组 令字符串 S=S[1]S[2]...S[n]S=S[1]S[2]...S[n]{\displaystyle S=S[1]S[2]...S[n]} , S[i,j]S[i,j]{\dis ...

  2. 【2012百度之星/资格赛】H:用户请求中的品牌 [后缀数组]

    时间限制: 1000ms 内存限制: 65536kB 描述 馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到一些很奇葩的词汇.在比方说"johnsonj ...

  3. Boring counting HDU - 3518 (后缀数组)

    Boring counting \[ Time Limit: 1000 ms \quad Memory Limit: 32768 kB \] 题意 给出一个字符串,求出其中出现两次及以上的子串个数,要 ...

  4. HDU4080 Stammering Aliens(二分 + 后缀数组)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4080 Description Dr. Ellie Arroway has establish ...

  5. 后缀数组 + Hash + 二分 or Hash + 二分 + 双指针 求 LCP ---- 2017icpc 青岛 J Suffix (假题!!)

    题目链接 题目大意: 就是给你n个串每个串取一个后缀,要求把串拼起来要求字典序最小!! sum_length_of_n≤5e5sum\_length\_of\_n\leq 5e5sum_length_ ...

  6. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]

    题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...

  7. [Ahoi2013]差异[后缀数组+单调栈]

    链接 解题思路:很明显前面∑1<=i<j<=nlen(Ti)+len(Tj)\sum_{1<=i<j<=n}len(T_i)+len(T_j)∑1<=i< ...

  8. poj2217详解 ( 后缀数组 + 高度数组 )

    题目大概意思就是 给两个字符串,求最长公共字符串子串长度 我们可以考虑用后缀数组和高度数组 一个字符串 中 最长的两个相同字符串长度, 不就是 后缀数组中相邻两个后缀的最长公共前缀, 不就是 高度数组 ...

  9. 树链剖分 + 后缀数组 - E. Misha and LCP on Tree

    E. Misha and LCP on Tree Problem's Link Mean: 给出一棵树,每个结点上有一个字母.每个询问给出两个路径,问这两个路径的串的最长公共前缀. analyse: ...

最新文章

  1. MySQL 5.6通过MMM实现读写分离的高可用架构
  2. Sql server 2005系统表详细说明
  3. Java 判断字符串第一位和最后一位,并截取
  4. i春秋DMZ大型靶场实验(四)Hash基础
  5. linux下搭建mongodb副本集
  6. 数据库工具一段时间后打开报错:远程过程调用失败0x800706be
  7. Hive的基本操作总结
  8. mysql n 识别_mysql – 不能有“不识别”的N:M关系吗?
  9. 瞬间读懂什么是互联网思维、大数据、O2O、众筹、红海
  10. DNS域名解析基础知识
  11. 高通工具过滤_高通QXDM|高通诊断监视工具(Qualcomm QXDM)下载v3.14 官方版 - 欧普软件下载...
  12. Java验证码生成工具类(简洁高效)
  13. 8uftp目标计算机拒接,8UFTP连接FTP时空白的解决办法
  14. energy plus matlab,Energyplus教程系列1—Energyplus到底能干啥.ppt
  15. (5/300)常微分方程之一阶齐次方程
  16. 实在智能签约上海联通,共创美好智慧生活
  17. 珍藏5个在线免费接收国内外手机短信验证码的网络服务
  18. (4.3C)神奇的口袋
  19. table中英文值显示其对应中文
  20. ASP.NET - 查询邮件及邮件内容

热门文章

  1. yii 执行指定迁移文件_MySQL迁移PG工具pymysql2pgsql
  2. java 默认参数_Java 方法的参数可以有默认值吗?
  3. java程序一写文件就崩溃_为什么直接修改java的.class文件会导致程序崩溃
  4. linux mint 18 mysql_linux mint下mysql中文支持问题
  5. opengl绘制长方体线框_OpenGL绘图实例十之绘制3D机器人
  6. 完全相同的4个小矩形如图所示放置_短线投资,遇到“矩形突破”,斩钉截铁满仓干!...
  7. 一部论述修养人生处世出世的集录_读《菜根谭》,人生本是修心的过程
  8. mongodb聚合查询优化_【MongoDB】MongoDB 性能优化 - BI查询聚合
  9. linux命令行变大,Linux命令行下'!'的8大神奇的用法!
  10. 转json_Java对象转JSON时如何动态的增删改查属性