求出后缀数组和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的更多相关文章

  1. SPOJ-SUBST1 New Distinct Substrings(后缀数组)

    题目大意:判断总共有多少种不同的子串. 题目分析:不同的子串数目为 Σ(后缀SA[i]的长度-height[i]). 代码如下: # include<iostream> # include ...

  2. SPOJ - SUBST1 New Distinct Substrings —— 后缀数组 单个字符串的子串个数

    题目链接:https://vjudge.net/problem/SPOJ-SUBST1 SUBST1 - New Distinct Substrings #suffix-array-8 Given a ...

  3. 后缀数组---New Distinct Substrings

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

  4. SPOJ 694. Distinct Substrings (后缀数组不相同的子串的个数)转

    694. Distinct Substrings Problem code: DISUBSTR   Given a string, we need to find the total number o ...

  5. 后缀数组:SPOJ SUBST1 - New Distinct Substrings

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

  6. DISUBSTR - Distinct Substrings

    DISUBSTR - Distinct Substrings no tags  Given a string, we need to find the total number of its dist ...

  7. 705. New Distinct Substrings spoj(后缀数组求所有不同子串)

    705. New Distinct Substrings Problem code: SUBST1 Given a string, we need to find the total number o ...

  8. 【SPOJ】Distinct Substrings(后缀自动机)

    [SPOJ]Distinct Substrings(后缀自动机) 题面 Vjudge 题意:求一个串的不同子串的数量 题解 对于这个串构建后缀自动机之后 我们知道每个串出现的次数就是\(right/e ...

  9. 【SPOJ】Distinct Substrings/New Distinct Substrings(后缀数组)

    [SPOJ]Distinct Substrings/New Distinct Substrings(后缀数组) 题面 Vjudge1 Vjudge2 题解 要求的是串的不同的子串个数 两道一模一样的题 ...

随机推荐

  1. vue-devtools 安装

    vue火了很久了,但是一直赶不上时代步伐的我今天才开始学,首先,根据vue官网介绍,推荐安装Vue Devtools.它允许你在一个更友好的界面中审查和调试 Vue 应用. 首先,将vue-devto ...

  2. Snipaste屏幕截图的使用

    什么是Snipaste Snipaste是一款屏幕截图软件 类似于微信的截图 Snipaste使用步骤 百度搜索Snipaste 如图 点击 根据自己电脑系统选择安装 下载完成后 解压到当前文件夹 点 ...

  3. windows中抓包命令,以及保存为多个文件的方法

    本文主要介绍windows中抓包命令,以及保存为多个文件的方法 说一说保存为多个文件存储数据包这个问题的由来,一般如果长时间抓包,有可能需要等上几个小时,因为这个时候抓包的内容都是存放在内存中的,几个 ...

  4. RobotFramework+Selenium如何提高脚本稳定性

     通过RF来跑selenium的脚本,正常运行一遍都没有问题,但如果要多次运行,提高脚本的稳定性,那么应该如何做呢?  当然有时候最简单最简单的方法就是直接通过sleep来等待,虽然简单粗暴,但会带来 ...

  5. JVM详解(四)——运行时数据区-堆

    一.堆 1.介绍 Java运行程序对应一个进程,一个进程就对应一个JVM实例.一个JVM实例就有一个运行时数据区(Runtime),Runtime里面,就只有一个堆,一个方法区.这里也阐述了,方法区和 ...

  6. FastAPI 学习之路(三十二)创建数据库

    在大型的web开发中,我们肯定会用到数据库操作,那么FastAPI也支持数据库的开发,你可以用 PostgreSQL MySQL SQLite Oracle 等 本文用SQLite为例.我们看下在fa ...

  7. 从源码层面深度剖析Redisson实现分布式锁的原理(全程干货,注意收藏)

    Redis实现分布式锁的原理 前面讲了Redis在实际业务场景中的应用,那么下面再来了解一下Redisson功能性场景的应用,也就是大家经常使用的分布式锁的实现场景. 引入redisson依赖 < ...

  8. 将manjaro作为主力开发系统,我遇到了哪些坑。

    首先遇到的问题就是企业微信. 最开始几天,我直接去安装企业微信和微信,安装全都报错了. 无奈之下,只好安装了virtual box,装了一个win7,可以正常使用微信,企业微信,最开始蛋疼的地方是,企 ...

  9. HZOI帝国2019欢乐时刻

    前言: update 只是恢复一下原来手残删掉的博客,不是在水,嘤嘤嘤 update 以后改成Stack,但是之前的就懒得改了... by 10.31 为了窝的访问量大家的好心情,模仿学长搞了一个这个 ...

  10. 用C++实现的数独解题程序 SudokuSolver 2.6 的新功能及相关分析

    SudokuSolver 2.6 的新功能及相关分析 SudokuSolver 2.6 的命令清单如下: H:\Read\num\Release>sudoku.exe Order please: ...