SPOJ_705_New Distinct Substrings_后缀数组

题意:

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


后缀数组的一个小应用。

考虑每个后缀的贡献,如果不要求本质不同那就是n-sa[i]-1。

然后需要去重,就是把height[i]这部分减掉。

代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. #include <stdlib.h>
  5. using namespace std;
  6. #define N 50050
  7. int ws[N],wa[N],wb[N],wv[N],r[N],sa[N],height[N],rank[N],n,m;
  8. char s[N];
  9. void build_suffix_array() {
  10. m=129;
  11. int i,j,p,*x=wa,*y=wb,*t;
  12. for(i=0;i<m;i++) ws[i]=0;
  13. for(i=0;i<n;i++) ws[x[i]=r[i]]++;
  14. for(i=1;i<m;i++) ws[i]+=ws[i-1];
  15. for(i=n-1;i>=0;i--) sa[--ws[x[i]]]=i;
  16. for(j=p=1;p<n;j<<=1,m=p) {
  17. for(p=0,i=n-j;i<n;i++) y[p++]=i;
  18. for(i=0;i<n;i++) if(sa[i]-j>=0) y[p++]=sa[i]-j;
  19. for(i=0;i<n;i++) wv[i]=x[y[i]];
  20. for(i=0;i<m;i++) ws[i]=0;
  21. for(i=0;i<n;i++) ws[wv[i]]++;
  22. for(i=1;i<m;i++) ws[i]+=ws[i-1];
  23. for(i=n-1;i>=0;i--) sa[--ws[wv[i]]]=y[i];
  24. for(t=x,x=y,y=t,x[sa[0]]=0,i=p=1;i<n;i++) {
  25. if(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+j]==y[sa[i-1]+j]) x[sa[i]]=p-1;
  26. else x[sa[i]]=p++;
  27. }
  28. }
  29. for(i=1;i<n;i++) rank[sa[i]]=i;
  30. for(i=p=0;i<n-1;height[rank[i++]]=p)
  31. for(p?p--:0,j=sa[rank[i]-1];r[i+p]==r[j+p];p++) ;
  32. }
  33. int main() {
  34. int T;
  35. scanf("%d",&T);
  36. while(T--) {
  37. scanf("%s",s);
  38. int i;
  39. n=strlen(s);
  40. for(i=0;i<n;i++) r[i]=s[i];
  41. r[n++]=0;
  42. build_suffix_array();
  43. long long ans=0;
  44. for(i=1;i<n;i++) ans+=n-sa[i]-1-height[i];
  45. printf("%lld\n",ans);
  46. }
  47. }

SPOJ_705_New Distinct Substrings_后缀数组的更多相关文章

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

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

  2. SPOJ - DISUBSTR Distinct Substrings (后缀数组)

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

  3. SPOJ DISUBSTR Distinct Substrings 后缀数组

    题意:统计母串中包含多少不同的子串 然后这是09年论文<后缀数组——处理字符串的有力工具>中有介绍 公式如下: 原理就是加上新的,减去重的,这题是因为打多校才补的,只能说我是个垃圾 #in ...

  4. SPOJ 694 || 705 Distinct Substrings ( 后缀数组 && 不同子串的个数 )

    题意 : 对于给出的串,输出其不同长度的子串的种类数 分析 : 有一个事实就是每一个子串必定是某一个后缀的前缀,换句话说就是每一个后缀的的每一个前缀都代表着一个子串,那么如何在这么多子串or后缀的前缀 ...

  5. spoj Distinct Substrings 后缀数组

    给定一个字符串,求不相同的子串的个数. 假如给字符串“ABA";排列的子串可能: A B A AB  BA ABA 共3*(3+1)/2=6种; 后缀数组表示时: A ABA BA 对于A和 ...

  6. [spoj694&spoj705]New Distinct Substrings(后缀数组)

    题意:求字符串中不同子串的个数. 解题关键:每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同的前缀的个数. 1.总数减去height数组的和即可. 注意这里height中为什么不需 ...

  7. 【SPOJ – SUBST1】New Distinct Substrings 后缀数组

    New Distinct Substrings 题意 给出T个字符串,问每个字符串有多少个不同的子串. 思路 字符串所有子串,可以看做由所有后缀的前缀组成. 按照后缀排序,遍历后缀,每次新增的前缀就是 ...

  8. spoj 694. Distinct Substrings 后缀数组求不同子串的个数

    题目链接:http://www.spoj.com/problems/DISUBSTR/ 思路: 每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同的前缀的个数.如果所有的后缀按照su ...

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

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

随机推荐

  1. hdu 4857 逆拓扑+大根堆(priority_queue)

    题意:排序输出:在先满足定约束条件下(如 3必需在1前面,7必需在4前面),在满足:1尽量前,其次考虑2,依次.....(即有次约束). 开始的时候,只用拓扑,然后每次在都可以选的时候,优先考虑小的, ...

  2. HDU 5893 List wants to travel(树链剖分+线段树)

    题目链接 HDU5893 $2016$年$ICPC$沈阳网络赛的$B$题.这道题其和 BZOJ2243 基本一样 那道题我也写了题解 点这里 两道题的区别就是$BZOJ$这题是点的权值,这道题是边权. ...

  3. LibieOJ 6165 一道水题 (线性筛)

    题目链接 LOJ6165 题目意思其实就是求LCM(1, 2, 3, ..., n) 直接用线性筛求出1到1e8之间的所有质数 然后对于每个质数p,他对答案的贡献为$p^{i}$ 其中$p^{i}$小 ...

  4. C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案

    本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...

  5. Codeforces Round #320 (Div. 2) [Bayan Thanks-Round]

    一部分题解,算是自己SB了 上午的TC 也是这样 写好了代码,却一直没注意细节,然后以为错了. 此处省100字,ps 貌似紫了,作为一个老菜鸡,终于紫了 A,B 都是语文题 C: 给以一个三角形一样的 ...

  6. 临远的spring security教程

    为啥选择Spring Security 欢迎阅读咱们写的Spring Security教程,咱们既不想写一个简单的入门教程,也不想翻译已有的国外教程.咱们这个教程就是建立在咱们自己做的OA的基础上,一 ...

  7. C++再论单例模式

    #include <iostream> #include <windows.h> #include <mutex> std::mutex gmutex; using ...

  8. directdraw 显示yuv

    http://www.cnblogs.com/lidan/archive/2012/03/23/2413772.html http://www.yirendai.com/msd/

  9. Axure Base 02

    (二)Axure rp的线框图元件 l  图片 图片元件拖入编辑区后,可以通过双击选择本地磁盘中的图片,将图片载入到编辑区,axure会自动提示将大图片进行优化,以避免原型文件过大:选择图片时可以选择 ...

  10. POJ 1861 Network (Kruskal算法+输出的最小生成树里最长的边==最后加入生成树的边权 *【模板】)

    Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14021   Accepted: 5484   Specia ...