SPOJ694 DISUBSTR

题目描述:

Given a string, we need to find the total number of its distinct substrings.

输入格式:

T- number of test cases. T<=20;
Each test case consists of one string, whose length is <= 1000

输出格式:

For each test case output one number saying the number of distinct substrings.

翻译:

给定一个字符串,求该字符串含有的本质不同的子串数量。

后缀数组和后缀自动机都可做,但因为两者是不同的东西,不妨都谈谈。

后缀数组:

所有的子串数量为\(n*(n+1)/2\),只要去重即可

比如字符串ABABA,将其后缀排序后:

A
ABA
ABABA
BA
BABA

重复的子串一定是后缀的公共前缀。

如何正确的得到一个排序方式,来得到所有的重复子串呢?

注意到重复的子串说明了两者的前面有一截相似,也就是说,两者的排名相近。

那么将字符排序后,有重复前缀的定会排在一起。

其中height数组就是两者重复的子串数量。

如果一个后缀自己有很多重复子串呢?

如ABABAB

那么

ABABAB

ABAB

AB

这些height数组会一一将影响抵消

因此答案即为 \(n*(n+1)/2 - \sum_{i=1}^{n} height(i) \)

后缀自动机:

非常简单粗暴,相同的子串出现的\(right\)集合一定相同,

所以只要根据每个\(right\)集合的\(max - min\)统计即可

(对于本题而言,由于字符集太大(128),所以用后缀自动机做不太好)

或者用后缀自动机建出后缀数组来求height

注:SPOJ705为跟本题类似的题,但后缀自动机无法通过

后缀数组代码

SPOJ694 DISUBSTR --- 后缀数组 / 后缀自动机的更多相关文章

  1. 字符串的模板 Manacher kmp ac自动机 后缀数组 后缀自动机

    为何scanf("%s", str)不需要&运算 经常忘掉的字符串知识点,最好不加&,不加&最标准,指针如果像scanf里一样加&是错的,大概是未定 ...

  2. 【整理】如何选取后缀数组&&后缀自动机

    后缀家族已知成员         后缀树         后缀数组         后缀自动机         后缀仙人掌         后缀预言         后缀Splay ? 后缀树是后缀数 ...

  3. loj6173 Samjia和矩阵(后缀数组/后缀自动机)

    题目: https://loj.ac/problem/6173 分析: 考虑枚举宽度w,然后把宽度压位集中,将它们哈希 (这是w=2的时候) 然后可以写一下string=“ac#bc” 然后就是求这个 ...

  4. (17/34)AC自动机/后缀数组/后缀自动机(施工中)

    快补题别再摸鱼了(17/34) 1.AC自动机 #define maxnode 1000010 #define maxsize 26 struct ahocT{ int ch[maxnode][max ...

  5. bzoj 3172 后缀数组|AC自动机

    后缀数组或者AC自动机都可以,模板题. /************************************************************** Problem: 3172 Us ...

  6. [Luogu5161]WD与数列(后缀数组/后缀自动机+线段树合并)

    https://blog.csdn.net/WAautomaton/article/details/85057257 解法一:后缀数组 显然将原数组差分后答案就是所有不相交不相邻重复子串个数+n*(n ...

  7. POJ2774Long Long Message (后缀数组&后缀自动机)

    问题: The little cat is majoring in physics in the capital of Byterland. A piece of sad news comes to ...

  8. POJ1743 Musical Theme (后缀数组 & 后缀自动机)最大不重叠相似子串

    A musical melody is represented as a sequence of N (1<=N<=20000)notes that are integers in the ...

  9. SPOJ- Distinct Substrings(后缀数组&后缀自动机)

    Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...

随机推荐

  1. 【CodeForces】947 C. Perfect Security 异或Trie

    [题目]C. Perfect Security [题意]给定长度为n的非负整数数组A和数组B,要求将数组B重排列使得A[i]^B[i]的字典序最小.n<=3*10^5,time=3.5s. [算 ...

  2. [CodePlus 2017 11月赛]晨跑 题解(辗转相除法求GCD)

    [CodePlus 2017 11月赛]晨跑 Description "无体育,不清华"."每天锻炼一小时,健康工作五十年,幸福生活一辈子".在清华,体育运动绝 ...

  3. 项目开发 -- ZFS容量分配

    存储池 allocated 池中已实际分配的存储空间量.该属性也可通过其简短列名alloc来引用. capacity 已用的池空间百分比.此属性也可通过其简短列名cap来引用. dedupratio ...

  4. Tinyos 第三版Make系统

    1.make系统安装 cd tools ./Bootstrap ./configure make sudo make install 2.make系统结构 3.第三版Makerules文件部分解析 # ...

  5. 多维数组的字符依次输出,用python实现

    #-*- coding=utf-8 -*-listm=["s","l","z","x","l",&q ...

  6. c++中指针常量,常指针,指向常量的常指针区分

    const char * myPtr = &char_A;//指向常量的指针 char * const myPtr = &char_A;//常量的指针 const char * con ...

  7. java中的matches -> 完全匹配

    matches是完全匹配.跟matcher不一样, matcher像perl正则, 能匹配到符合的都会返回true, 而这个matches要完全一模一样才行. import java.util.reg ...

  8. Python异常捕捉try except else finally有return时执行顺序探究

    转载自 https://www.cnblogs.com/JohnABC/p/4065437.html 学习python或者其他有异常控制的编程语 言, 大家很有可能说try except finall ...

  9. 一款线程安全、基本功能齐全的STL

    MiniSTL 目前正在完成一个STL,主要想通过该项目锻炼C++编程.模板编程.熟悉STL.锻炼数据结构和算法能力. 项目的目标是实现STL的几大构件+线程安全.项目过程中主要参考SGI STL源码 ...

  10. Linux sqlite3基本命令

    简介sqlite3一款主要用于嵌入式的轻量级数据库,本文旨在为熟悉sqlite3基本命令提供技术文档. 备注:本文所有操作均在root用户下进行. 1.安装sqlite3 ubuntu下安装sqlit ...