题目:http://cojs.tk/cogs/problem/problem.php?pid=1709

1709. [SPOJ705]不同的子串

★★   输入文件:subst1.in   输出文件:subst1.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

给定一个字符串,计算其不同的子串个数。

【输入格式】

一行一个仅包含大写字母的字符串,长度<=50000

【输出格式】

一行一个正整数,即不同的子串个数。

【样例输入】

  1. ABABA

【样例输出】

  1. 9

【来源】

SPOJ 705 New Distinct Substrings

自动选择评测机
 
打开 O2 优化
COGS Grader
无优化开关

提交代码 Pascal C C++

题解:

后缀数组

我们可以想到ans=总共子串的个数-相同的个数。

相同的个数即为height[]之和。

(len为字符串长度)总共子串的个数:

长度为1的个数:len

长度为2的个数:len-1

.

.

.

所以总共个数为len+(len-1)……+2+1=(len*(len-1))/2

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define MAXN 50010
  4. #define LL long long
  5. int Ws[MAXN],sa[MAXN],wa[MAXN],wb[MAXN],wv[MAXN],Rank[MAXN],height[MAXN];
  6. char str[MAXN];
  7. int cmp(int *r,int a,int b,int l){return (r[a]==r[b])&&(r[a+l]==r[b+l]);}
  8. void DA(char *r,int *sa,int n,int m)
  9. {
  10. int i,j,p,*x=wa,*y=wb,*t;
  11. for(i=;i<m;i++)Ws[i]=;
  12. for(i=;i<n;i++)Ws[x[i]=r[i]]++;
  13. for(i=;i<m;i++)Ws[i]+=Ws[i-];
  14. for(i=n-;i>=;i--)sa[--Ws[x[i]]]=i;
  15. for(j=,p=;p<n;j*=,m=p)
  16. {
  17. for(p=,i=n-j;i<n;i++)y[p++]=i;
  18. for(i=;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j;
  19. for(i=;i<n;i++)wv[i]=x[y[i]];
  20. for(i=;i<m;i++)Ws[i]=;
  21. for(i=;i<n;i++)Ws[wv[i]]++;
  22. for(i=;i<m;i++)Ws[i]+=Ws[i-];
  23. for(i=n-;i>=;i--)sa[--Ws[wv[i]]]=y[i];
  24. for(t=x,x=y,y=t,p=,x[sa[]]=,i=;i<n;i++)
  25. x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
  26. }
  27. }
  28. void calheight(int n)
  29. {
  30. int i,j,k=;
  31. for(i=;i<=n;i++)Rank[sa[i]]=i;
  32. for(i=;i<n;height[Rank[i++]]=k)
  33. for(k?k--:,j=sa[Rank[i]-];str[i+k]==str[j+k];k++);
  34. }
  35. int main()
  36. {
  37. freopen("subst1.in","r",stdin);
  38. freopen("subst1.out","w",stdout);
  39. int lstr,i;
  40. LL ans=;
  41. scanf("%s",str);
  42. lstr=strlen(str);
  43. str[lstr+]=;
  44. DA(str,sa,lstr+,);
  45. calheight(lstr);
  46. ans=((LL)(lstr+)*lstr)/;
  47. for(i=;i<=lstr;i++)ans-=(LL)height[i];
  48. printf("%lld",ans);
  49. fclose(stdin);
  50. fclose(stdout);
  51. return ;
  52. }

Cogs 1709. [SPOJ705]不同的子串 后缀数组的更多相关文章

  1. poj 2774 最长公共子串 后缀数组

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 25752   Accepted: 10 ...

  2. URAL 1297 最长回文子串(后缀数组)

    1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB The “U.S. Robots” HQ has just received a ...

  3. poj 1743 Musical Theme(最长重复子串 后缀数组)

    poj 1743 Musical Theme(最长重复子串 后缀数组) 有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复 ...

  4. BZOJ 1396: 识别子串( 后缀数组 + 线段树 )

    这道题各位大神好像都是用后缀自动机做的?.....蒟蒻就秀秀智商写一写后缀数组解法..... 求出Height数组后, 我们枚举每一位当做子串的开头. 如上图(x, y是height值), Heigh ...

  5. BZOJ 3230 相似子串 | 后缀数组 二分 ST表

    BZOJ 3230 相似子串 题面 题解 首先我们要知道询问的两个子串的位置. 先正常跑一遍后缀数组并求出height数组. 对于每一个后缀suffix(i),考虑以i开头的子串有多少是之前没有出现过 ...

  6. bzoj 3230 相似子串——后缀数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3230 作出后缀数组,从 LCP 看每个位置对于本质不同子串的贡献,而且他们已经按前面部分排好 ...

  7. 【poj1743-Musical Theme】不可重叠最长重复子串-后缀数组

    http://poj.org/problem?id=1743 这题是一道后缀数组的经典例题:求不可重叠最长重复子串. 题意: 有N(1 <= N <=20000)个音符的序列来表示一首乐曲 ...

  8. Codevs 3160 最长公共子串(后缀数组)

    3160 最长公共子串 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给出两个由小写字母组成的字符串,求它们的最长公共子串的长 ...

  9. BZOJ 3230: 相似子串(后缀数组)

    传送门 解题思路 其实题目挺好想的.首先子串排名可以由后缀数组求得,因为不算重复的,所以后缀数组的每个后缀排名的去掉\(lcp\)的前缀排名为当前后缀的子串排名.这样就可以预处理出每个后缀的\(l,r ...

随机推荐

  1. c++ fstream中seekg()和seekp()的用法

    转自:http://blog.sina.com.cn/s/blog_679f85d40100mysi.html 先说一下C语言中fseek()的功能: 函数原型:int fseek(FILE *fp, ...

  2. scala - 从合并两个Map说开去 - foldLeft 和 foldRight 还有模式匹配

    开发中遇到需求:合并两个Map集合对象(将两个对应KEY的值累加) 先说解决方案: ( map1 )) ) } 这特么什么鬼  (╯‵□′)╯""┻━┻☆))>○<)  ...

  3. js监听

    IE浏览器监听: function attachEvent(string eventFlag, function eventFunc) eventFlag: 事件名称,但要加上on,如onclick. ...

  4. html5/css3响应式布局介绍及设计流程

    html5/css3响应式布局介绍 html5/css3响应式布局介绍及设计流程,利用css3的media query媒体查询功能.移动终端一般都是对css3支持比较好的高级浏览器不需要考虑响应式布局 ...

  5. DOM Ready 详解

    DOM Ready 概述 熟悉jQuery的人, 都知道DomReady事件. window.onload事件是在页面所有的资源都加载完毕后触发的. 如果页面上有大图片等资源响应缓慢, 会导致wind ...

  6. php异步请求(可以做伪线程)

    $fp = fsockopen("www.baidu.com", 80, $errno, $errstr, 30); stream_set_blocking($fp,0);     ...

  7. Python使用re实现计算器

    re 正则表达式 计算器 海瑞博客-学习python之路•2016-12-01•Python• 59•0•A+ A- re是一门小型语言 元字符 .      通配符除了\n ^     以什么开始的 ...

  8. 定位 -CLGeocoder - 编码

    #import "ViewController.h" #import <CoreLocation/CoreLocation.h> @interface ViewCont ...

  9. MySQL简单使用

    1.启动MySQL服务器实际上上篇已讲到如何启动MySQL.两种方法:一是用winmysqladmin,如果机器启动时已自动运行,则可直接进入下一步操作.二是在DOS方式下运行 d:/mysql/bi ...

  10. 深入探究JavaScript中的比较问题

    先用最近遇到的几个问题做引子: 1 console.log(null==undefined); //true 2 console.log(null==false);//false 3 console. ...