题目链接

根据height数组的性质分组计算。

  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include <cmath>
  7. #include <map>
  8. #include <set>
  9. #include <string>
  10. #include <queue>
  11. #include <stack>
  12. #include <bitset>
  13. using namespace std;
  14. #define pb(x) push_back(x)
  15. #define ll long long
  16. #define mk(x, y) make_pair(x, y)
  17. #define lson l, m, rt<<1
  18. #define mem(a) memset(a, 0, sizeof(a))
  19. #define rson m+1, r, rt<<1|1
  20. #define mem1(a) memset(a, -1, sizeof(a))
  21. #define mem2(a) memset(a, 0x3f, sizeof(a))
  22. #define rep(i, n, a) for(int i = a; i<n; i++)
  23. #define fi first
  24. #define se second
  25. typedef pair<int, int> pll;
  26. const double PI = acos(-1.0);
  27. const double eps = 1e-;
  28. const int mod = 1e9+;
  29. const int inf = ;
  30. const int dir[][] = { {-, }, {, }, {, -}, {, } };
  31. const int maxn = 2e4+;
  32. int sa[maxn];
  33. int t1[maxn],t2[maxn],c[maxn], a[maxn];
  34. int rankk[maxn],height[maxn], ans;
  35. void build_sa(int s[],int n,int m)
  36. {
  37. int i,j,p,*x=t1,*y=t2;
  38. for(i=;i<m;i++)c[i]=;
  39. for(i=;i<n;i++)c[x[i]=s[i]]++;
  40. for(i=;i<m;i++)c[i]+=c[i-];
  41. for(i=n-;i>=;i--)sa[--c[x[i]]]=i;
  42. for(j=;j<=n;j<<=)
  43. {
  44. p=;
  45. for(i=n-j;i<n;i++)y[p++]=i;
  46. for(i=;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j;
  47. for(i=;i<m;i++)c[i]=;
  48. for(i=;i<n;i++)c[x[y[i]]]++;
  49. for(i=;i<m;i++)c[i]+=c[i-];
  50. for(i=n-;i>=;i--)sa[--c[x[y[i]]]]=y[i];
  51. swap(x,y);
  52. p=;x[sa[]]=;
  53. for(i=;i<n;i++)
  54. x[sa[i]]=y[sa[i-]]==y[sa[i]] && y[sa[i-]+j]==y[sa[i]+j]?p-:p++;
  55. if(p>=n)break;
  56. m=p;
  57. }
  58. }
  59. void getHeight(int s[],int n)
  60. {
  61. int i,j,k=;
  62. for(i=;i<=n;i++)rankk[sa[i]]=i;
  63. for(i=;i<n;i++)
  64. {
  65. if(k)k--;
  66. j=sa[rankk[i]-];
  67. while(s[i+k]==s[j+k])k++;
  68. height[rankk[i]]=k;
  69. }
  70. }
  71. int cal(int x, int n) {
  72. int minn = sa[], maxx = sa[];
  73. int flag = ;
  74. for(int i = ; i<=n; i++) {
  75. if(height[i]<x) {
  76. if(maxx-minn>=x)
  77. ans++;
  78. maxx = minn = sa[i];
  79. flag = ;
  80. } else {
  81. maxx = max(maxx, sa[i]);
  82. minn = min(minn, sa[i]);
  83. }
  84. }
  85. if(maxx-minn>=x)
  86. ans++, flag = ;
  87. return flag;
  88. }
  89. int main()
  90. {
  91. string s;
  92. while(cin>>s) {
  93. if(s[] == '#')
  94. break;
  95. ans = ;
  96. for(int i = ; i<s.size(); i++)
  97. a[i] = s[i]-'a'+;
  98. a[s.size()] = ;
  99. build_sa(a, s.size()+, );
  100. getHeight(a, s.size());
  101. for(int i = ; i<=(s.size()+)/; i++) {
  102. if(!cal(i, s.size()))
  103. break;
  104. }
  105. cout<<ans<<endl;
  106. }
  107. return ;
  108. }

hdu 3518 Boring counting 后缀数组的更多相关文章

  1. hdu 3518 Boring counting 后缀数组LCP

    题目链接 题意:给定长度为n(n <= 1000)的只含小写字母的字符串,问字符串子串不重叠出现最少两次的不同子串个数; input: aaaa ababcabb aaaaaa # output ...

  2. hdu 3518 Boring counting 后缀数组基础题

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  3. hdu 3518 Boring counting 后缀数组 height分组

    题目链接 题意 对于给定的字符串,求有多少个 不重叠的子串 出现次数 \(\geq 2\). 思路 枚举子串长度 \(len\),以此作为分界值来对 \(height\) 值进行划分. 显然,对于每一 ...

  4. 后缀数组 --- HDU 3518 Boring counting

    Boring counting Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3518 Mean: 给你一个字符串,求:至少出 ...

  5. HDU 3518 Boring counting(后缀数组,字符处理)

    题目 参考自:http://blog.sina.com.cn/s/blog_64675f540100k9el.html 题目描述: 找出一个字符串中至少重复出现两次的字串的个数(重复出现时不能重叠). ...

  6. HDU 3518 Boring counting

    题目:Boring counting 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3518 题意:给一个字符串,问有多少子串出现过两次以上,重叠不能算两次 ...

  7. hdu3518 Boring counting(后缀数组)

    Boring counting 题目传送门 解题思路 后缀数组.枚举每种长度,对于每个字符串,记录其最大起始位置和最小起始位置,比较是否重合. 代码如下 #include <bits/stdc+ ...

  8. HDOJ 题目3518 Boring counting(后缀数组,求不重叠反复次数最少为2的子串种类数)

    Boring counting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. HDU 4358 Boring counting(莫队+DFS序+离散化)

    Boring counting Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others) ...

随机推荐

  1. Spring 4.0 中的 WebSocket 架构

    两年前,客户端与服务器端的全双工双向通信作为一个很重要的功能被纳入到WebSocket RFC 6455协议中.在HTML5中,WebSocket已经成为一个流行词,大家对这个功能赋予很多构想,很多时 ...

  2. iOS状态栏字体设置为白色

    info.plist 添加字段: view controller -base status bar appearence 设为NO [[UIApplication sharedApplication] ...

  3. ftp上来显示的时间和系统时间不一致

    ftp上来显示的时间和系统时间不一致,是因为默认情况下,vsftpd 是用GMT做为他的时间的,所以和系统的时间可能会不一致 修改也非常简单: vi /etc/vsftpd/vsftpd.conf 在 ...

  4. C++中联合体(union)的使用

    typedef union para { ]; struct { double a; double b; double c; double d; }NP; }NPara; //或者如下所示 union ...

  5. uva12589

    题目大意:给n(n<=50)个向量(xi,yi) (0<=xi<=yi<=50),选出其中k(1<=k<=n)个,从(0,0)点开始,依次首尾相连,求此k个向量与x ...

  6. PHP Curl CURLOPT_POSTFIELDS 1024

    resolve : curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); url: http://www.laruence.com/2011/ ...

  7. Android RadioGroup/RadioButton

    RadioGroup      RadioButton的集合,提供多选一的机制      属性:   android:orientation="horizontal/vertical&quo ...

  8. RelativeLayout布局下实现控件平分空间

    起源:使用惯LinearLayout的朋友都知道,若想实现对屏幕的等分,只需要设置Layout_weight的值即可. 可是在RelativeLayout布局下实现等分却不是那么容易. 下面就简单介绍 ...

  9. 中标麒麟6.0_ICE3.4.2编译+demo测试(CPP)

    (菜鸟版)确保 gcc版本4.4.6(其他版本未测试),4.8不行 一.降级GCC到4.4.6 注意:gcc g++ c++命令都为4.4.6(可用gcc -v; g++ -v; c++ -v 命令查 ...

  10. 诞生于饭桌上的jcSQL语言

    相信每个Coder都有心在自己求学阶段可以写一门自己的语言,无论是毕业设计,还是课余爱好:不管是为了提升B格,还是想练手,抑或对其他语言不满,想自己撸一个,只要坚持下去了,都是不错的理由. 现在正值暑 ...