评测地址:https://cn.vjudge.net/problem/CSU-1632

Description

求字符串中所有出现至少2次的子串个数

Input

第一行为一整数T(T<=10)表示用例组数,每组用例占一行为一个长度不超过100000的字符串

Output

对于每组用例,输出该串中所有出现至少两次的子串个数

Sample Input

3

aabaab

aaaaa

AaAaA

Sample Output

5

4

5

Solution

Ans=sum(max(height(i)-height(i-1),0))

  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. const int N=1e5+;
  5. int T,n,ans,c[N],sa[N],tsa[N],trank[N],rank[N],h[N];
  6. char s[N];
  7. void DA(int maxx=){
  8. memset(c,,sizeof c);int p;
  9. for(int i=;i<=n;i++) c[rank[i]=s[i]]++;
  10. for(int i=;i<=maxx;i++) c[i]+=c[i-];
  11. for(int i=n;i;i--) sa[c[rank[i]]--]=i;
  12. trank[sa[]]=p=;
  13. for(int i=;i<=n;i++){
  14. if(rank[sa[i]]!=rank[sa[i-]]) p++;
  15. trank[sa[i]]=p;
  16. }
  17. for(int i=;i<=n;i++) rank[i]=trank[i];
  18. for(int k=;p<n;k<<=,maxx=p){
  19. p=;
  20. for(int i=n-k+;i<=n;i++) tsa[++p]=i;
  21. for(int i=;i<=n;i++) if(sa[i]>k) tsa[++p]=sa[i]-k;
  22. memset(c,,sizeof c);
  23. for(int i=;i<=n;i++) trank[i]=rank[tsa[i]];
  24. for(int i=;i<=n;i++) c[trank[i]]++;
  25. for(int i=;i<=maxx;i++) c[i]+=c[i-];
  26. for(int i=n;i;i--) sa[c[trank[i]]--]=tsa[i];
  27. trank[sa[]]=p=;
  28. for(int i=;i<=n;i++){
  29. if(rank[sa[i]]!=rank[sa[i-]]||rank[sa[i]+k]!=rank[sa[i-]+k]) p++;
  30. trank[sa[i]]=p;
  31. }
  32. for(int i=;i<=n;i++) rank[i]=trank[i];
  33. }
  34. for(int i=,k=;i<=n;i++){
  35. int j=sa[rank[i]-];
  36. while(s[i+k]==s[j+k]) k++;
  37. h[rank[i]]=k;if(k>)k--;
  38. }
  39. }
  40. void GO(){
  41. ans=;
  42. for(int i=;i<=n;i++) if(h[i]>h[i-]) ans+=h[i]-h[i-];
  43. printf("%d\n",ans);
  44. }
  45. int main(){
  46. scanf("%d",&T);
  47. while(T--){
  48. scanf("%s",s+);n=strlen(s+);
  49. DA();
  50. GO();
  51. }
  52. return ;
  53. }

CSU-1632 Repeated Substrings[后缀数组求重复出现的子串数目]的更多相关文章

  1. UVALive - 6869 Repeated Substrings 后缀数组

    题目链接: http://acm.hust.edu.cn/vjudge/problem/113725 Repeated Substrings Time Limit: 3000MS 样例 sample ...

  2. poj3261 后缀数组求重复k次可重叠的子串的最长长度

    Milk Patterns Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 13669   Accepted: 6041 Ca ...

  3. poj2774 Long Long Message 后缀数组求最长公共子串

    题目链接:http://poj.org/problem?id=2774 这是一道很好的后缀数组的入门题目 题意:给你两个字符串,然后求这两个的字符串的最长连续的公共子串 一般用后缀数组解决的两个字符串 ...

  4. POJ - 3415 Common Substrings(后缀数组求长度不小于 k 的公共子串的个数+单调栈优化)

    Description A substring of a string T is defined as: T( i, k)= TiTi+1... Ti+k-1, 1≤ i≤ i+k-1≤| T|. G ...

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

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

  6. Maximum repetition substring (poj3693 后缀数组求重复次数最多的连续重复子串)

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6328   Acc ...

  7. poj2774 后缀数组 求最长公共子串

    Reference:IOI2009论文 http://www.cnblogs.com/ziyi--caolu/p/3192731.html #include "stdio.h" # ...

  8. Long Long Message (poj2774 后缀数组求最长公共子串)

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 19206   Accepted: 79 ...

  9. poj 1743 男人八题之后缀数组求最长不可重叠最长重复子串

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14874   Accepted: 5118 De ...

随机推荐

  1. 作为Java程序员应该掌握的10项技能

    本文详细罗列了作为Java程序员应该掌握的10项技能.分享给大家供大家参考.具体如下: 1.语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知 ...

  2. Python——装饰器与面向切面编程

    今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较 为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函 ...

  3. HTTP——HTTP 1.1的详细介绍 Gunicorn不支持HTTP 1.1

    从前面一小节的表格里,我们可以看到,Gunicorn 的一个缺点是不支持HTTP 1.1.那么 HTTP 1.1 究竟是怎么一回事呢?我们选择 HTTP 服务器在什么情况下需要考虑对 HTTP 1.1 ...

  4. linux c 获取网卡状态(UP or DOWN)

    源代码例如以下: #include <sys/socket.h> #include <sys/ioctl.h> #include <linux/if.h> #inc ...

  5. android adt 最新下载地址23.03

    打开这个网址就可以看到adt的详细信息:  http://developer.android.com/sdk/installing/installing-adt.html 或者直接在你的eclipse ...

  6. .net服务器端发起请求封装

    写一个静态类封装类似客户端的请求 public static class HttpHelper { #region Get public static string HttpGet(string ur ...

  7. android推送方式

    本文介绍在Android中实现推送方式的基础知识及相关解决方案.推送功能在手机开发中应用的场景是越来起来了,不说别的,就我们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅读最新的新闻信息. ...

  8. Linux系统中磁盘block和windos中的簇一个意思

    block就是几个连续扇区组成一个block,每个分区可以设置block大小,好比一个txt只有2字节,但是这个分区的block为4K,那么其实这个txt需要4k来存储(所以大文件block设置大比较 ...

  9. NIO之通道(Channel)的原理与获取以及数据传输与内存映射文件

    通道(Channel) 由java.nio.channels包定义的,Channel表示IO源与目标打开的连接,Channel类似于传统的“流”,只不过Channel本身不能直接访问数据,Channe ...

  10. Xilinx RocketIO模块的介绍

    摘要: 在高速电路系统设计中,差分串行通信方式正在取代并行总线方式,以满足系统对高带宽数据通信的需求.RocketIO是Virtex2 Pro以上系列FPGA中集成的专用高速串行数据收发模块,可用于实 ...