SPOJ SUBST1 New Distinct Substrings(后缀数组)

2023-10-13 05:08

本文主要是介绍SPOJ SUBST1 New Distinct Substrings(后缀数组),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:

一个字符串有多少个不同的字串

思路:

题意与思路和 SPOJ DISUBSTR完全相同,唯一不同是数据范围,用后缀数组复杂度完全够,注意下long long 即可

错误及反思:

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=50000+10;
int sa[N],rak[N],height[N];
char s[N];
void construct(const char *s,int n,int m = 256)
{static int t1[N],t2[N],c[N];int *x = t1,*y = t2;int i,j,k,p,l;for (i = 0; i < m; ++ i) c[i] = 0;for (i = 0; i < n; ++ i) c[x[i] = s[i]] ++;for (i = 1; i < m; ++ i) c[i] += c[i - 1];for (i = n - 1; i >= 0; -- i) sa[--c[x[i]]] = i;for (k = 1; k <= n; k <<= 1) {p = 0;for (i = n - k; i < n; ++ i) y[p++] = i;for (i = 0; i < n; ++ i) if (sa[i] >= k) y[p++] = sa[i] - k;for (i = 0; i < m; ++ i) c[i] = 0;for (i = 0; i < n; ++ i) c[x[y[i]]] ++;for (i = 1; i < m; ++ i) c[i] += c[i - 1];for (i = n - 1; i >= 0; -- i) sa[--c[x[y[i]]]] = y[i];swap(x,y);p = 1; x[sa[0]] = 0;for (i = 1; i < n; ++ i)x[sa[i]] = y[sa[i - 1]] == y[sa[i]]&& y[sa[i - 1] + k] == y[sa[i] + k] ? p - 1: p ++;if (p >= n) break;m = p;}for (i = 0; i < n; ++ i) rak[sa[i]] = i;for (i = 0,l = 0; i < n; ++ i) {if (rak[i]) {j = sa[rak[i] - 1];while (s[i + l] == s[j + l]) l++;height[rak[i]] = l;if (l) l--;}}
}int main(){int T;scanf("%d",&T);while(T--){scanf("%s",s);int len=strlen(s);construct(s,len+1);long long sum=0;for(int i=2;i<=len;i++){sum+=1ll*height[i];}printf("%I64d\n",1ll*len*(len+1)/2-sum);}
}

这篇关于SPOJ SUBST1 New Distinct Substrings(后缀数组)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/200969

相关文章

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

详解MySQL中DISTINCT去重的核心注意事项

《详解MySQL中DISTINCT去重的核心注意事项》为了实现查询不重复的数据,MySQL提供了DISTINCT关键字,它的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据... 目录DISTINCT 六大注意事项1. 作用范围:所有 SELECT 字段2. NULL 值的特殊处

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a