[spojSUBST1]New Distinct Substrings
求出后缀数组和height数组,然后因为子串即后缀的前缀,考虑不断新增后缀然后计算贡献,如果以sa的顺序新增那么第i个就会产生n-sa[k]+1-h[k](n-sa[k]+1为总方案,h为不合法的方案),累计即可。
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 50005
4 int n,m,ans,a[N],b[N],h[N],sum[N],ra[N<<1],sa[N];
5 char s[N],s1[N];
6 void change(){
7 for(int i=0;i<n;i++)a[i]=s[i];
8 memcpy(ra,a,sizeof(a));
9 sort(a,a+n);
10 m=unique(a,a+n)-a;
11 for(int i=0;i<n;i++)ra[i]=lower_bound(a,a+m,ra[i])-a+1;
12 }
13 void sort(int k){
14 memset(sum,0,sizeof(sum));
15 for(int i=0;i<n;i++)sum[ra[i+k]+1]++;
16 for(int i=1;i<=m;i++)sum[i+1]+=sum[i];
17 for(int i=0;i<n;i++)b[sum[ra[a[i]+k]]++]=a[i];
18 }
19 void build(){
20 for(int i=1;;i<<=1){
21 for(int j=0;j<n;j++)a[j]=j;
22 sort(i);
23 memcpy(a,b,sizeof(a));
24 sort(0);
25 m=a[b[0]]=1;
26 for(int j=1;j<n;a[b[j++]]=m)
27 if ((ra[b[j-1]]!=ra[b[j]])||(ra[b[j-1]+i]!=ra[b[j]+i]))m++;
28 memcpy(ra,a,sizeof(a));
29 if (m==n)break;
30 }
31 for(int i=0;i<n;i++)sa[ra[i]]=i;
32 }
33 void height(){
34 m=0;
35 for(int i=0;i<n;h[ra[i++]]=m,m-=(m>0))
36 for(int j=sa[ra[i]-1];(i!=j)&&(s[i+m]==s[j+m]);m++);
37 h[1]=0;
38 }
39 int lcp(int x,int y){
40 int ans=0x3f3f3f3f;
41 if (ra[x]>ra[y])swap(x,y);
42 for(int i=ra[x]+1;i<=ra[y];i++)ans=min(ans,h[i]);
43 return ans;
44 }
45 void write(int x,int y){
46 for(int i=x;i<=y;i++)printf("%c",s[i]);
47 }
48 int main(){
49 int t;
50 scanf("%d",&t);
51 while (t--){
52 scanf("%s",s);
53 n=strlen(s);
54 change();
55 build();
56 height();
57 ans=0;
58 for(int i=1;i<=n;i++)ans+=n-sa[i]-h[i];
59 printf("%d\n",ans);
60 }
61 }
[spojSUBST1]New Distinct Substrings的更多相关文章
- SPOJ-SUBST1 New Distinct Substrings(后缀数组)
题目大意:判断总共有多少种不同的子串. 题目分析:不同的子串数目为 Σ(后缀SA[i]的长度-height[i]). 代码如下: # include<iostream> # include ...
- SPOJ - SUBST1 New Distinct Substrings —— 后缀数组 单个字符串的子串个数
题目链接:https://vjudge.net/problem/SPOJ-SUBST1 SUBST1 - New Distinct Substrings #suffix-array-8 Given a ...
- 后缀数组---New Distinct Substrings
Description Given a string, we need to find the total number of its distinct substrings. Input T- nu ...
- SPOJ 694. Distinct Substrings (后缀数组不相同的子串的个数)转
694. Distinct Substrings Problem code: DISUBSTR Given a string, we need to find the total number o ...
- 后缀数组:SPOJ SUBST1 - New Distinct Substrings
Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...
- DISUBSTR - Distinct Substrings
DISUBSTR - Distinct Substrings no tags Given a string, we need to find the total number of its dist ...
- 705. New Distinct Substrings spoj(后缀数组求所有不同子串)
705. New Distinct Substrings Problem code: SUBST1 Given a string, we need to find the total number o ...
- 【SPOJ】Distinct Substrings(后缀自动机)
[SPOJ]Distinct Substrings(后缀自动机) 题面 Vjudge 题意:求一个串的不同子串的数量 题解 对于这个串构建后缀自动机之后 我们知道每个串出现的次数就是\(right/e ...
- 【SPOJ】Distinct Substrings/New Distinct Substrings(后缀数组)
[SPOJ]Distinct Substrings/New Distinct Substrings(后缀数组) 题面 Vjudge1 Vjudge2 题解 要求的是串的不同的子串个数 两道一模一样的题 ...
随机推荐
- 为什么下一个十年的主战场在 Serverless?
作者 | 不瞋 阿里云 Serverless 负责人 "唯有超越,才能让我们走下去." 这是不瞋在阿里的第十年.从 2010 年加入阿里云,不瞋参与了阿里云飞天分布式系统的研发,历 ...
- centos无法建立ssl连接
在centos下使用wget安装mysql5.7时,提示无法建立ssl连接 查阅资料,在命令wget后加上 --no-check-certificate也还是无法建立SSL连接. 后来,觉得可能是由于 ...
- 初识HTML01
什么是页面? 页面是基于浏览器的应用程序 页面是数据展示的载体,由浏览器和服务器共同执行产物. 浏览器的功能 向服务器发送用户请求指令 接收并解析数据展示给用户 服务器的功能 存储页面资源 处理并响应 ...
- 【UE4 C++】 外部图片读取、Texture 保存 png
蓝图版 导入外部图片 file://E:/UE___Projects_Test/MyProjectAAA/Plugins/WXimage.jpg 导出图图片 一般导出 .hdr 文件 导出 png 设 ...
- Golang通脉之错误处理
在实际工程项目中,总是通过程序的错误信息快速定位问题,但是又不希望错误处理代码写的冗余而又啰嗦.Go语言没有提供像Java.C#语言中的try...catch异常处理方式,而是通过函数返回值逐层往上抛 ...
- Scrum Meeting 12
第12次例会报告 日期:2021年06月03日 会议主要内容概述: 介绍了现有进度,wpb介绍了jwt的用法以及部署的swagger的测试用法. 一.进度情况 我们采用日报的形式记录每个人的具体进度, ...
- SkyWalking配上告警更优秀
前言 对于监控系统来说,不可能让人一直盯着监控看板,而更多的是以自动提醒的方式,比如邮件.短信或微信推送等,当达到或超出预设的告警指标时,就自动发送消息提醒,下面就来说说如何配置SkyWalking的 ...
- Spring Cloud 微服务实战——nacos 服务注册中心搭建(附源码)
作为微服务的基础功能之一的注册中心担任重要的角色.微服务将单体的服务拆分成不同的模块下的服务,而不同的模块的服务如果进行通信调用呢?这就需要服务注册与发现.本文将使用阿里开源项目 nacos 搭建服务 ...
- 深入探索 Linux listen() 函数 backlog 的含义
1:listen()回顾以及问题引入 2:正确的解释 3:实验验证 1:listen()回顾以及问题引入 listen()函数是网络编程中用来使服务器端开始监听端口的系统调用,首先来回顾下listen ...
- sprint boot 自动创建web应用(3)
1. springboot自动创建地址:https://start.spring.io/ 2.选择web(springMVC) 3.点击创建 4.创建成功 5.解压,导入项目 6.新建成功 7.原因 ...