题目地址:https://ac.nowcoder.com/acm/contest/551/C

题目:


给出字符串长度n和k,求字符串中长度≥k的不同子串数目

解题思路:


用到后缀数组算法中的height数组,height[i]表示排名第i的后缀字符串和第i-1名的后缀字符串的最长公共前缀长度,如图:

若要求不同的子串数目,每个后缀字符串ss对结果的贡献都是len(ss)-它对应的height[]值(减去重复的子串)

若要求长度≥k的不同子串数目,每个后缀字符串ss对结果的贡献都是len(ss)-max(它对应的height[]值, k-1),可能k-1的长度大于height的长度,相当于在减去重复的子串的基础上再减去长度<k的子串,对结果的贡献不能是负数,再与0比较去较大值。

⚠️结果用long long 存

ac代码:


#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
//不能声明ws,保留字
int sa[maxn], rankk[maxn], height[maxn], wv[maxn], wss[maxn], wa[maxn], wb[maxn], r[maxn];
char s[maxn];
bool cmp(int *r, int a, int b, int l)
{return r[a] == r[b] && r[a + l] == r[b + l];
}
//O(nlogn)
void get_sa(int *r, int *sa, int n, int m)
{int *x=wa, *y=wb;int p =0, i, j;for(i = 0; i < m; i++) wss[i] = 0;for(i = 0; i < n; i++) wss[ x[i]=r[i] ]++;for(i = 1; i <= m; i++) wss[i] += wss[i - 1];for(i = n - 1; i >= 0; i--) sa[--wss[x[i]]] = i;for(j = 1, p = 1; p < n; j *= 2, m = p){//对第二关键字排序for(p = 0, i = n - j; i < n; i++) // [n-j,n)没有内容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]]; //排名为i的第二关键字对应的第一关键字的排名,x此时相当于rankk,y相当于第二关键字的safor(i = 0; i < m; i++) wss[i] = 0;for(i = 0; i < n; i++) wss[wv[i]]++;for(i = 1; i <= m; i++) wss[i] += wss[i - 1];for(i = n - 1; i >= 0; i--) sa[--wss[wv[i]]] = y[i];//相同的字符串排名相同swap(x,y);for(i = 1, p = 1, x[sa[0]] = 0; i < n; i++)x[sa[i]] = cmp(y, sa[i-1], sa[i], j) ? p - 1 : p++;}
}
//O(n)
void get_height(int n)
{int k = 0;for(int i = 1; i <= n; i++) rankk[sa[i]] = i;for(int i = 0; i < n; i++){k ? k-- : 0;//根据性质height[rank[i]] ≥ (height[rank[i-1]] -1)int j = sa[rankk[i] - 1];//上一名的开始下标while(r[i + k] == r[j + k]) k++;height[rankk[i]] = k;}
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);int n, m, Size = 255;long long ans = 0;scanf("%d %d", &n, &m);scanf("%s",s);for(int i = 0; i < n; i++)r[i] = (int)s[i];r[n] = 0;get_sa(r, sa, n + 1, Size);get_height(n);for(int i = 1; i <= n; i++)ans += max(0,n - sa[i] - max(m - 1, height[i]));printf("%lld\n", ans);return 0;
}

【2019“新智认知”杯: C】CSL的密码(求长度≥k的不同子串数---后缀数组)相关推荐

  1. “新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛 B.CSL 的英语考试

    CSL 的英语考试 CSL 为了备战即将到来的六级考试,在外面报了一个英语培训班.经过了一学期的学习后,英语老师决定要对 CSL 的学习成果进行检测.老师准备了一份卷子,考虑到 CSL 的英语水平,卷 ...

  2. “新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛----G-CSL的训练计划

    首先发出题目链接: 链接:https://ac.nowcoder.com/acm/contest/551/F 来源:牛客网 涉及:有向图 题目如下: 题目意思(表示我太chun,读了几遍才勉强明白了题 ...

  3. 2021“MINIEYE杯”中国大学生算法设计超级联赛(4)Display Substring(后缀数组+二分)

    Display Substring #include<bits/stdc++.h> using namespace std; typedef long long ll; // sa[i]: ...

  4. 新智元2019 AI独角兽白皮书:58%落户北京,25%创始人出身清华

    https://www.toutiao.com/a6674781597700456964/ [新智元导读]即使投资市场日趋平寂,也挡不住中国人工智能创业市场的如火如荼.智能+中国主平台新智元重磅发布& ...

  5. 传智2019python 百度云_java百万年薪架构师2019新视频教程 百度云网盘

    你还没有注册,无法下载本站所有资源,请立即注册! 您需要 登录 才可以下载或查看,没有帐号?立即注册 x Java视频教程名称:java百万年薪架构师2019新视频教程 Java视频教程 百度网盘下载 ...

  6. 2019北京智源大会在京开幕, 中外学术大咖共话人工智能研究前沿

    10月31日,由北京智源人工智能研究院主办的2019北京智源大会在国家会议中心开幕,会期两天.智源大会是北京创建全球人工智能学术和创新最优生态的标志性学术活动,定位于"内行的AI盛会&quo ...

  7. 智源杯天文数据算法挑战赛开赛,前沿AI技术助力天文科学研究

    由北京智源人工智能研究院主办,国家天文台.数据评测平台biendata联合举办的天体分类数据竞赛于2020年1月开赛.本次比赛旨在鼓励大众参与到天文学的探索当中,利用最新的人工智能算法分析望远镜收集到 ...

  8. 来2019全球智博会 见证AI创新未来

    2019全球智博会,值得期待! 由科技部.工信部和江苏省政府指导.苏州市政府和新一代人工智能产业技术创新战略联盟共同主办的2019全球人工智能产品应用博览会(以下简称"全球智博会" ...

  9. 来2019全球智博会 见证AI创新未来 1

    2019全球智博会,值得期待! 由科技部.工信部和江苏省政府指导.苏州市政府和新一代人工智能产业技术创新战略联盟共同主办的2019全球人工智能产品应用博览会(以下简称"全球智博会" ...

  10. 第八届育才杯机器人比赛_疫情防控常态化,传统赛事新转型 “育才杯”第九届青岛国际象棋学校锦标赛(网络)顺利举办...

    原标题:疫情防控常态化,传统赛事新转型 "育才杯"第九届青岛国际象棋学校锦标赛(网络)顺利举办 "育才杯"青岛市国际象棋学校锦标赛是一项传统赛事,去年举办了第八 ...

最新文章

  1. component-scan和annotation-driven
  2. Oracle复习(知识点、练习题、实验)
  3. GMF 教程 Mindmap 6
  4. python-if判断的本质
  5. 东京大学计算机专业研究生好吗,东北大学计算机类研究生个人考研经历以及感受...
  6. vim的几个常用操作
  7. Mac读写NTFS驱动程序神器Tuxera NTFS2022
  8. 三维视觉之结构光原理详解
  9. An Introduction to Pairing-Based Cryptography学习笔记
  10. CentOS7L2TP/IPSec
  11. 关于生物医学工程{血站+软件}的看法
  12. 京东API、获得JD商品详情API调取数据部分代码展示
  13. CSS笔试题: 实现表格首行首列固定和自适应窗口
  14. 用Python玩转数据数据处理相关小例编程题
  15. 这5个灵感网站,设计师都在逛
  16. postgresql查询锁表以及解除锁表
  17. FirstBlood
  18. 天空卫士客户案例 | 上汽集团数据安全篇
  19. 总结mybatis plus解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)方法
  20. 实现页面方块跟随鼠标移动而移动

热门文章

  1. “运营商不能沦为管道”是一个错误的理论
  2. 比Google Map更加清晰的网络地图——RealBird
  3. 那些年学java遇到的好东西
  4. 存储设备在linux名称,Linux下的存储设备的管理
  5. mysql查询忽略字符编码是什么_MySQL 查询不区分大小写的问题以及编码格式问题...
  6. mongoose学习记录
  7. 使用go语言开发一个后端gin框架的web项目
  8. 必看干货!五个步骤帮您成功实施IT SLA
  9. 《Windows Server 2012 Hyper-V虚拟化管理实践》——2.3 Hyper-V角色安装后的状态
  10. webform 组合查询