SUBST1 - New Distinct Substrings

no tags 

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

Input

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

Output

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

Example

  1. Input:
  2. 2
  3. CCCCC
  4. ABABA
  5.  
  6. Output:
  7. 5
  8. 9

ac代码

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. #include<iostream>
  5. #define min(a,b) (a>b?b:a)
  6. #define max(a,b) (a>b?
  7.  
  8. a:b)
  9. using namespace std;
  10. char str[50010];
  11. int sa[50100],Rank[50100],rank2[50100],height[50010],c[50100],*x,*y,s[50100];
  12. int n;
  13. void cmp(int n,int sz)
  14. {
  15. int i;
  16. memset(c,0,sizeof(c));
  17. for(i=0;i<n;i++)
  18. c[x[y[i]]]++;
  19. for(i=1;i<sz;i++)
  20. c[i]+=c[i-1];
  21. for(i=n-1;i>=0;i--)
  22. sa[--c[x[y[i]]]]=y[i];
  23. }
  24. void build_sa(int *s,int n,int sz)
  25. {
  26. x=Rank,y=rank2;
  27. int i,j;
  28. for(i=0;i<n;i++)
  29. x[i]=s[i],y[i]=i;
  30. cmp(n,sz);
  31. int len;
  32. for(len=1;len<n;len<<=1)
  33. {
  34. int yid=0;
  35. for(i=n-len;i<n;i++)
  36. {
  37. y[yid++]=i;
  38. }
  39. for(i=0;i<n;i++)
  40. if(sa[i]>=len)
  41. y[yid++]=sa[i]-len;
  42. cmp(n,sz);
  43. swap(x,y);
  44. x[sa[0]]=yid=0;
  45. for(i=1;i<n;i++)
  46. {
  47. if(y[sa[i-1]]==y[sa[i]]&&sa[i-1]+len<n&&sa[i]+len<n&&y[sa[i-1]+len]==y[sa[i]+len])
  48. x[sa[i]]=yid;
  49. else
  50. x[sa[i]]=++yid;
  51. }
  52. sz=yid+1;
  53. if(sz>=n)
  54. break;
  55. }
  56. for(i=0;i<n;i++)
  57. Rank[i]=x[i];
  58. }
  59. void getHeight(int *s,int n)
  60. {
  61. int k=0;
  62. for(int i=0;i<n;i++)
  63. {
  64. if(Rank[i]==0)
  65. continue;
  66. k=max(0,k-1);
  67. int j=sa[Rank[i]-1];
  68. while(s[i+k]==s[j+k])
  69. k++;
  70. height[Rank[i]]=k;
  71. }
  72. }
  73. int main()
  74. {
  75. int t;
  76. scanf("%d",&t);
  77. while(t--)
  78. {
  79. int i;
  80. scanf("%s",str);
  81. int len=strlen(str);
  82. for(i=0;i<len;i++)
  83. s[i]=str[i];
  84. s[len]=0;
  85. build_sa(s,len+1,260);
  86. getHeight(s,len);
  87. int sum=0;
  88. for(i=1;i<=len;i++)
  89. {
  90. sum+=len-sa[i]-height[i];
  91. }
  92. printf("%d\n",sum);
  93. }
  94. }

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 – SUBST1】New Distinct Substrings 后缀数组

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

  3. POJ3415 Common Substrings —— 后缀数组 + 单调栈 公共子串个数

    题目链接:https://vjudge.net/problem/POJ-3415 Common Substrings Time Limit: 5000MS   Memory Limit: 65536K ...

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

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

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

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

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

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

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

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

  8. SPOJ DISUBSTR Distinct Substrings 后缀数组

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

  9. spoj Distinct Substrings 后缀数组

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

随机推荐

  1. CSS隐藏overflow默认滚动条同时保留滚动效果

    主要应用于移动端场景,仿移动端滚动效果.对于隐藏滚动条,众所周知overflow:hidden,但是想要的滚动效果也没了. 所以对于移动端webkit内核提供一个伪类选择器: .element::-w ...

  2. ofbiz初级教程

    本教程是ofbiz 基本应用,它涵盖了OFBiz应用程序开发过程的基本原理.目标是使开发人员熟悉最佳实践,编码惯例,基本控制流程以及开发人员对OFBiz定制所需的所有其他方面. 本教程将帮助您在OFB ...

  3. POJ 题目2774 Long Long Message(后缀数组,求最长公共子串长度)

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 23696   Accepted: 97 ...

  4. 跟我学设计模式视频教程——适配器模式,适配器模式VS装饰模式

    课程视频 适配器模式 适配器模式VS装饰模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍

  5. Baby_Step,Gaint_Step(分析具体解释+模板)

    下面是总结自他人博客资料.以及本人自己的学习经验. [Baby_Step,Gaint_Step定义] 高次同余方程. BL == N (mod P) 求解最小的L.因为数据范围非常大,暴力不行 这里用 ...

  6. zzulioj--1777--和尚特烦恼3——何时能下山(水题)

    1777: 和尚特烦恼3--何时能下山 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 203  Solved: 111 SubmitStatusWeb ...

  7. [ZJOJ2014] 力 解题报告 (FFT)

    题目链接: https://www.luogu.org/problemnew/show/P3338 题目: 给出$n$个数$q_i$,令$F_j=\sum_{i<j}\frac{q_iq_j}{ ...

  8. MHA+ProxySQL 读写分离高可用

    文档结构如下: 1.ProxySQL说明 ProxySQL是mysql的一款中间件的产品,是灵活的mysql代理层,可以实现读写分离,支持query路由器的功能,支持动态指定sql进行缓存,支持动态加 ...

  9. ASP页面的执行顺序

    http://hi.baidu.com/yanjiezhu/item/29c113c3912e2a0ac710b2d3 1.对象初始化(OnInit方法) 页面中的控件(包括页面本身)都是在它们最初的 ...

  10. UVa 10943 How do you add?【递推】

    题意:给出n,k,问恰好有k个不超过n的数的和为n的方案数有多少 可以隔板法来做 现在有n个小球放到k个盒子里面,盒子可以为空 那么就是n-k+1个缝隙,放上k-1个隔板(k-1个隔板就分成了k份) ...