[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 题解 要求的是串的不同的子串个数 两道一模一样的题 ...
随机推荐
- 1-Java继承中多态情况特性下变量,方法,静态方法的访问
在Java继承下,多态特性下类成员访问情况 /* 在继承中,变量时静态的绑定的,非静态方法是动态的绑定的,静态方法是静态绑定的 */ class Parent{ int number = 11; pu ...
- 零基础怎么学Java?Java的运行机制是什么?Java入门基础!
Java语言是当前流行的一种程序设计语言,因其安全性.平台无关性.性能优异等特点,受到广大编程爱好者的喜爱. 想学习Java语言的同学对于Java的运行机制是必须要了解的!! 计算机高级语言的类型主要 ...
- Redis 面试常见问题———缓存雪崩、缓存击穿以及缓存穿透
在开发中会面临缓存异常可能会出现三个问题,分别是缓存雪崩.缓存击穿和缓存穿透.这三个问题会导致大量请求从缓存转移到数据库,如果请求的并发量很大的话,就会导致数据库崩溃.所以在面试官也会经常问这些问题. ...
- Windows系统安装Java步骤
今天学习到Burp Suite的使用,提示到安装Burp Suite需要安装Java环境. 于是乎,本弱鸡开启了漫长的Java环境安装之路~ 一.Java SE版本众多,在这里推荐下载Java1.8版 ...
- Scrum Meeting 0609
零.说明 日期:2021-6-9 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 困难 qsy PM&前端 完成前端功能 ...
- Mac上安装Grafana
Mac上安装Grafana 一.背景 二.安装步骤 1.通过 Home Brew 安装 2.通过二进制包进行安装 1.下载 2.grafana配置文件的路径 3.修改grafana配置 1.修改默认的 ...
- kafka错误之 Topic xxx not present in metadata after 60000 ms
Topic xxx not present in metadata after 60000 ms 一.背景 二.场景还原 1.jar包引入 2.jar代码 3.运行结果 三.问题解决 四.参考文档 一 ...
- 深入理解Linux C语言内存管理
问题不能拖,我这就来学习一下吧,争取一次搞定. 在任何程序设计环境及语言中,内存管理都十分重要. 内存管理的基本概念 分析C语言内存的分布先从Linux下可执行的C程序入手.现在有一个简单的C源程序h ...
- 攻防世界 web1.view_source
右键不管用,F12打开控制台,直接查看flag.
- 从零开始 DIY 智能家居 - 基于 ESP32 的智能紫外线传感器模块
目录 前言 硬件选择 二.使用步骤 获取代码 设备控制命令: 设备和协议初始化流程: 配置设备信息 回调函数注册 数据获取与上报流程 总结 前言 做了这么多传感器都是自己玩,这次家里人看不下去了,非得 ...