题目:不同子串个数

这题需要利用后缀数组求出的height的性质,我们发现对于每个后缀,他的height后的所有子串就是算在答案里,因此答案只需要求出n-height[i]-sa[i]+1的和就可以了。

代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
const int N = 1e5 + 5;
using namespace std;
char s[N];
int n, rk[N], sa[N], psa[N], k1[N], k2[N], cnt[N], m, height[N];
void get_sort()
{
for(int i = 0;i < n; i++)
cnt[(int)s[i]]++;
for(int i = 1; i < m; i++)
cnt[i] += cnt[i - 1];
for(int i = 0; i < n; i++)
rk[i] = cnt[(int)s[i]] - 1;
for(int w = 1; w < n; w<<=1)
{
for(int i = 0; i < n; i++)
{
if(i + w >= n)
k2[i] = 0;
else
k2[i] = rk[i + w];
k1[i] = rk[i];
}
for(int i = 0; i < n; i++)
cnt[i] = 0;
for(int i = 0; i < n; i++)
cnt[k2[i]]++;
for(int i = 1; i < m; i++)
cnt[i] += cnt[i - 1];
for(int i = n - 1; i >= 0; i--)
psa[--cnt[k2[i]]] = i;
for(int i = 0; i < n; i++)
cnt[i] = 0;
for(int i = 0; i < n; i++)
cnt[k1[i]]++;
for(int i = 1; i < m; i++)
cnt[i] += cnt[i - 1];
for(int i = n - 1; i >= 0; i--)
sa[--cnt[k1[psa[i]]]] = psa[i];
int tmp = 1;
rk[sa[0]] = 1;
for(int i = 1; i < n; i++)
if(k1[sa[i]] == k1[sa[i - 1]] && k2[sa[i]] == k2[sa[i - 1]])
rk[sa[i]] = tmp;
else
rk[sa[i]] = ++tmp;
if(tmp == n)
break;
}
for(int i = 0; i < n; i++)
rk[sa[i]] = i;
}
void get_h()
{
int begin = 0;
for(int i = 0; i < n; i++)
{
if(!rk[i])
continue;
int j = sa[rk[i] - 1];
while(s[begin + i] == s[begin + j])
begin++;
height[rk[i]] = begin;
if(begin)
begin--;
}
}
int main()
{
scanf("%d %s", &n, s);
n = strlen(s);
m = max(n, 300);
get_sort();
get_h();
long long ret = 0;
for(int i = 0; i < n; i++)
ret += n - height[i] - sa[i];
printf("%lld\n", ret);
return 0;
}

2022春每日一题:Day 16的更多相关文章

  1. <每日一题>题目16:简单的python练习题(1-10)

    #1.python程序中__name__的作用是什么? __name__这个系统变量用来表示程序的运行方式. 如果程序在当前膜快运行,__name__的名称就是__main__, 如果不在(被调用), ...

  2. CISP/CISA 每日一题 16

    CISA 每日一题(答) 作业调度软件的优点: 1.作业信息仅需建立一次,减少错误发生概率: 2.可定义作业间的依赖关系,当某一项作业失败时,依赖于该作业的后续作业就不会被执行: 3.所有成功或失败的 ...

  3. 老男孩IT教育-每日一题汇总

    老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...

  4. [每日一题]面试官问:谈谈你对ES6的proxy的理解?

    [每日一题]面试官问:谈谈你对ES6的proxy的理解? 关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  5. 【JavaScript】【dp】Leetcode每日一题-解码方法

    [JavaScript]Leetcode每日一题-解码方法 [题目描述] 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : 'A' -> 1 'B' -> 2 ... 'Z' -& ...

  6. 【python】Leetcode每日一题-颠倒二进制位

    [python]Leetcode每日一题-颠倒二进制位 [题目描述] 颠倒给定的 32 位无符号整数的二进制位. 示例1: 输入: 00000010100101000001111010011100 输 ...

  7. 【Java每日一题】20170106

    20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  8. 【Java每日一题】20170105

    20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  9. 【Java每日一题】20170104

    20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  10. 【Java每日一题】20170103

    20161230问题解析请点击今日问题下方的"[Java每日一题]20170103"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

随机推荐

  1. Linux或Docker里安装minio / Docker中安装h5ai

    此文为单节点搭建操作 Linux中搭建minio 对象存储服务器 下载minio安装包 wget https://dl.minio.io/server/minio/release/linux-amd6 ...

  2. KingbaseES 全文检索功能介绍

    KingbaseES 内置的缺省的分词解析器采用空格分词,因为中文的词语之间没有空格分割,所以这种方法并不适用于中文.要支持中文的全文检索需要额外的中文分词插件:zhparser and sys_ji ...

  3. 一文学会Spring JDBC 使用

    Spring JDBC 1.JDBC JDBC 就是 数据库开发 操作的 代名词,因为只要是现代商业项目的开发那么一定是离不开 数据库 的,不管你搞的是什么,只要是想使用动态的开发结构,那么一定就是 ...

  4. 微信小程序-前后端交互

    前台手机验证码登录 <view>手机号:</view> <input value="{{phone}}" bindinput="bindPh ...

  5. Chrome 浏览器缓存的问题

    浏览器缓存的问题 Chrome 在浏览器中设置: 1 Ctrl + Shift + Delete 2 Ctrl + F5 强制刷新 3 F12 打开控制台 ---> Network ---> ...

  6. Python实验报告——第4章 序列的应用

    实验报告 [实验目的] 1.掌握python中序列及序列的常用操作. 2.根据实际需要选择使用合适的序列类型. [实验条件] 1.PC机或者远程编程环境. [实验内容] 1.完成第四章 序列的应用 实 ...

  7. Kubernetes实践技巧:集群升级k8s版本

    更新证书 使用 kubeadm 安装 kubernetes 集群非常方便,但是也有一个比较烦人的问题就是默认的证书有效期只有一年时间,所以需要考虑证书升级的问题,本文的演示集群版本为 v1.16.2 ...

  8. Traefik 2.0 实现自动化 HTTPS

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247484457&idx=1&sn=35112e98 ...

  9. Alermanager_template,email

    default.tmpl {{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing ...

  10. 第六章:Django 综合篇 - 4:django-admin和manage.py

    目录 一.Django内置命令选项 check dbshell diffsettings flush makemigrations migrate runserver shell startapp s ...