题解:

后缀数组求出height

然后ans=所有串-所有height

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=;
  4. int t,ans,n,m,wa[N],wb[N],wsf[N],wv[N],sa[N],rank[N],height[N],s[N],a[N];
  5. char str[N],str1[N],str2[N];
  6. int cmp(int *r,int a,int b,int k)
  7. {
  8. return r[a]==r[b]&&r[a+k]==r[b+k];
  9. }
  10. void getsa(int *r,int *sa,int n,int m)
  11. {
  12. int *x=wa,*y=wb;
  13. for (int i=;i<m;i++)wsf[i]=;
  14. for (int i=;i<n;i++)wsf[x[i]=r[i]]++;
  15. for (int i=;i<m;i++)wsf[i]+=wsf[i-];
  16. for (int i=n-;i>=;i--)sa[--wsf[x[i]]]=i;
  17. for (int p=,j=;p<n;j*=,m=p)
  18. {
  19. p=;
  20. for (int i=n-j;i<n;i++)y[p++]=i;
  21. for (int i=;i<n;i++)
  22. if (sa[i]>=j)y[p++]=sa[i]-j;
  23. for (int i=;i<n;i++)wv[i]=x[y[i]];
  24. for (int i=;i<m;i++)wsf[i]=;
  25. for (int i=;i<n;i++)wsf[wv[i]]++;
  26. for (int i=;i<m;i++)wsf[i]+=wsf[i-];
  27. for (int i=n-;i>=;i--)sa[--wsf[wv[i]]]=y[i];
  28. swap(x,y);x[sa[]]=;p=;
  29. for (int i=;i<n;i++)x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
  30. }
  31. }
  32. void getheight(int *r,int n)
  33. {
  34. int j,k=;
  35. for (int i=;i<=n;i++)rank[sa[i]]=i;
  36. for (int i=;i<n;i++)
  37. {
  38. if (k)k--;
  39. else k=;
  40. j=sa[rank[i]-];
  41. while (r[i+k]==r[j+k])k++;
  42. height[rank[i]]=k;
  43. }
  44. }
  45. int main()
  46. {
  47. scanf("%d",&t);
  48. while (t--)
  49. {
  50. scanf("%s",str);
  51. int len=strlen(str);
  52. for (int i=;i<len;i++)s[i]=str[i];
  53. s[len]=;
  54. getsa(s,sa,len+,);
  55. getheight(s,len);
  56. int ans=(+len)*len/;
  57. for (int i=;i<=len;i++)ans-=height[i];
  58. printf("%d\n",ans);
  59. }
  60. }

spoj705的更多相关文章

  1. Cogs 1709. [SPOJ705]不同的子串 后缀数组

    题目:http://cojs.tk/cogs/problem/problem.php?pid=1709 1709. [SPOJ705]不同的子串 ★★   输入文件:subst1.in   输出文件: ...

  2. 【spoj705】 Distinct Substrings

    [题目描述] 给定一个字符串,计算其不同的子串个数. [输入格式] 一行一个仅包含大写字母的字符串,长度<=50000 [输出格式] 一行一个正整数,即不同的子串个数. [样例输入] ABABA ...

  3. spoj705 后缀数组求不同子串的个数

    http://www.spoj.com/problems/SUBST1/en/  题目链接 SUBST1 - New Distinct Substrings no tags  Given a stri ...

  4. [SPOJ705]不同的子串

    题目描述] 给定一个字符串,计算其不同的子串个数. [输入格式] 一行一个仅包含大写字母的字符串,长度<=50000 [输出格式] 一行一个正整数,即不同的子串个数. [样例输入] ABABA ...

  5. SPOJ 694&&SPOJ705: Distinct Substrings

    DISUBSTR - Distinct Substrings 链接 题意: 询问有多少不同的子串. 思路: 后缀数组或者SAM. 首先求出后缀数组,然后从对于一个后缀,它有n-sa[i]-1个前缀,其 ...

  6. SPOJ705 SUBST1 - New Distinct Substrings(后缀数组)

    给一个字符串求有多少个不相同子串. 每一个子串一定都是某一个后缀的前缀.由此可以推断出总共有(1+n)*n/2个子串,那么下面的任务就是找这些子串中重复的子串. 在后缀数组中后缀都是排完序的,从sa[ ...

  7. SPOJ705 Distinct Substrings (后缀自动机&后缀数组)

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

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

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

  9. 北京培训记day2

    后缀三姐妹 P.S.后缀大家族关系:后缀自动机fail指针=后缀树,后缀树前序遍历=后缀数组 一.后缀数组:orz罗穗骞集训队论文 给每个后缀按字典序排序 rank[]表示从i开始的后缀排名多少 sa ...

随机推荐

  1. Codeforces 1016 E - Rest In The Shades

    E - Rest In The Shades 思路: 相似 红色的长度等于(y - s) /  y 倍的 A' 和 B' 之间的 fence的长度 A' 是 p 和 A 连线和 x 轴交点, B'同理 ...

  2. HDU 4804 Campus Design

    HDU 4804 思路: 轮廓线dp #include<bits/stdc++.h> using namespace std; #define fi first #define se se ...

  3. legend2---开发日志8(thinkphp和vue如何配合才能达到最优)

    legend2---开发日志8(thinkphp和vue如何配合才能达到最优) 一.总结 一句话总结:凡是php可以做的,都可以先在后端处理好数据,然后再丢给前端 凡php可以做的,都可以先在后端处理 ...

  4. 昂达 v891 连接上adb 调试

    这篇文章可以删除了.  可以看看有关v891root和分区的文章,里面介绍了驱动程序的工具了. USB线连上之后,可以直接访问文件,所以连接本身肯定没有问题的. 可是,总是Windows 那边MTP驱 ...

  5. Solaris 10 disable ipv6

    亲测有效:) http://thegeekdiary.com/how-to-remove-ipv6-in-solaris-11/

  6. MySQL utf8 和 utf8mb4 的区别

    utf-8 时变化长度的编码,储存一个code point 需要1~4个字节. 然而,mysql的utf8只存储最多3个字节per code point. 所以,utf8字符集不能存储所有的unico ...

  7. 算法:最短路径之弗洛伊德(Floyd)算法

    https://cloud.tencent.com/developer/article/1012420 为了能讲明白弗洛伊德(Floyd)算法的主要思想,我们先来看最简单的案例.图7-7-12的左图是 ...

  8. 20180518VSTO多簿单表汇总外接程序按钮

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsof ...

  9. POJ-2955 Brackets(括号匹配问题)

    题目链接:http://poj.org/problem?id=2955 这题要求求出一段括号序列的最大括号匹配数量 规则如下: the empty sequence is a regular brac ...

  10. 用where导致group by分组字段的索引失效

    把两个单独的索引合并成一个组合索引,即把where条件字段的索引和group by的分组字段索引组合成一个. 如果分组的字段需要用函数处理,可以用索引函数 Generated Column(函数索引) ...