Cogs 1709. [SPOJ705]不同的子串 后缀数组
题目:http://cojs.tk/cogs/problem/problem.php?pid=1709
1709. [SPOJ705]不同的子串
★★ 输入文件:subst1.in
输出文件:subst1.out
简单对比
时间限制:1 s 内存限制:256 MB
【题目描述】
给定一个字符串,计算其不同的子串个数。
【输入格式】
一行一个仅包含大写字母的字符串,长度<=50000
【输出格式】
一行一个正整数,即不同的子串个数。
【样例输入】
- ABABA
【样例输出】
- 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
- #include<bits/stdc++.h>
- using namespace std;
- #define MAXN 50010
- #define LL long long
- int Ws[MAXN],sa[MAXN],wa[MAXN],wb[MAXN],wv[MAXN],Rank[MAXN],height[MAXN];
- char str[MAXN];
- int cmp(int *r,int a,int b,int l){return (r[a]==r[b])&&(r[a+l]==r[b+l]);}
- void DA(char *r,int *sa,int n,int m)
- {
- int i,j,p,*x=wa,*y=wb,*t;
- for(i=;i<m;i++)Ws[i]=;
- for(i=;i<n;i++)Ws[x[i]=r[i]]++;
- for(i=;i<m;i++)Ws[i]+=Ws[i-];
- for(i=n-;i>=;i--)sa[--Ws[x[i]]]=i;
- for(j=,p=;p<n;j*=,m=p)
- {
- for(p=,i=n-j;i<n;i++)y[p++]=i;
- for(i=;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j;
- for(i=;i<n;i++)wv[i]=x[y[i]];
- for(i=;i<m;i++)Ws[i]=;
- for(i=;i<n;i++)Ws[wv[i]]++;
- for(i=;i<m;i++)Ws[i]+=Ws[i-];
- for(i=n-;i>=;i--)sa[--Ws[wv[i]]]=y[i];
- for(t=x,x=y,y=t,p=,x[sa[]]=,i=;i<n;i++)
- x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
- }
- }
- void calheight(int n)
- {
- int i,j,k=;
- for(i=;i<=n;i++)Rank[sa[i]]=i;
- for(i=;i<n;height[Rank[i++]]=k)
- for(k?k--:,j=sa[Rank[i]-];str[i+k]==str[j+k];k++);
- }
- int main()
- {
- freopen("subst1.in","r",stdin);
- freopen("subst1.out","w",stdout);
- int lstr,i;
- LL ans=;
- scanf("%s",str);
- lstr=strlen(str);
- str[lstr+]=;
- DA(str,sa,lstr+,);
- calheight(lstr);
- ans=((LL)(lstr+)*lstr)/;
- for(i=;i<=lstr;i++)ans-=(LL)height[i];
- printf("%lld",ans);
- fclose(stdin);
- fclose(stdout);
- return ;
- }
Cogs 1709. [SPOJ705]不同的子串 后缀数组的更多相关文章
- poj 2774 最长公共子串 后缀数组
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 25752 Accepted: 10 ...
- URAL 1297 最长回文子串(后缀数组)
1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB The “U.S. Robots” HQ has just received a ...
- poj 1743 Musical Theme(最长重复子串 后缀数组)
poj 1743 Musical Theme(最长重复子串 后缀数组) 有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复 ...
- BZOJ 1396: 识别子串( 后缀数组 + 线段树 )
这道题各位大神好像都是用后缀自动机做的?.....蒟蒻就秀秀智商写一写后缀数组解法..... 求出Height数组后, 我们枚举每一位当做子串的开头. 如上图(x, y是height值), Heigh ...
- BZOJ 3230 相似子串 | 后缀数组 二分 ST表
BZOJ 3230 相似子串 题面 题解 首先我们要知道询问的两个子串的位置. 先正常跑一遍后缀数组并求出height数组. 对于每一个后缀suffix(i),考虑以i开头的子串有多少是之前没有出现过 ...
- bzoj 3230 相似子串——后缀数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3230 作出后缀数组,从 LCP 看每个位置对于本质不同子串的贡献,而且他们已经按前面部分排好 ...
- 【poj1743-Musical Theme】不可重叠最长重复子串-后缀数组
http://poj.org/problem?id=1743 这题是一道后缀数组的经典例题:求不可重叠最长重复子串. 题意: 有N(1 <= N <=20000)个音符的序列来表示一首乐曲 ...
- Codevs 3160 最长公共子串(后缀数组)
3160 最长公共子串 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给出两个由小写字母组成的字符串,求它们的最长公共子串的长 ...
- BZOJ 3230: 相似子串(后缀数组)
传送门 解题思路 其实题目挺好想的.首先子串排名可以由后缀数组求得,因为不算重复的,所以后缀数组的每个后缀排名的去掉\(lcp\)的前缀排名为当前后缀的子串排名.这样就可以预处理出每个后缀的\(l,r ...
随机推荐
- c++ fstream中seekg()和seekp()的用法
转自:http://blog.sina.com.cn/s/blog_679f85d40100mysi.html 先说一下C语言中fseek()的功能: 函数原型:int fseek(FILE *fp, ...
- scala - 从合并两个Map说开去 - foldLeft 和 foldRight 还有模式匹配
开发中遇到需求:合并两个Map集合对象(将两个对应KEY的值累加) 先说解决方案: ( map1 )) ) } 这特么什么鬼 (╯‵□′)╯""┻━┻☆))>○<) ...
- js监听
IE浏览器监听: function attachEvent(string eventFlag, function eventFunc) eventFlag: 事件名称,但要加上on,如onclick. ...
- html5/css3响应式布局介绍及设计流程
html5/css3响应式布局介绍 html5/css3响应式布局介绍及设计流程,利用css3的media query媒体查询功能.移动终端一般都是对css3支持比较好的高级浏览器不需要考虑响应式布局 ...
- DOM Ready 详解
DOM Ready 概述 熟悉jQuery的人, 都知道DomReady事件. window.onload事件是在页面所有的资源都加载完毕后触发的. 如果页面上有大图片等资源响应缓慢, 会导致wind ...
- php异步请求(可以做伪线程)
$fp = fsockopen("www.baidu.com", 80, $errno, $errstr, 30); stream_set_blocking($fp,0); ...
- Python使用re实现计算器
re 正则表达式 计算器 海瑞博客-学习python之路•2016-12-01•Python• 59•0•A+ A- re是一门小型语言 元字符 . 通配符除了\n ^ 以什么开始的 ...
- 定位 -CLGeocoder - 编码
#import "ViewController.h" #import <CoreLocation/CoreLocation.h> @interface ViewCont ...
- MySQL简单使用
1.启动MySQL服务器实际上上篇已讲到如何启动MySQL.两种方法:一是用winmysqladmin,如果机器启动时已自动运行,则可直接进入下一步操作.二是在DOS方式下运行 d:/mysql/bi ...
- 深入探究JavaScript中的比较问题
先用最近遇到的几个问题做引子: 1 console.log(null==undefined); //true 2 console.log(null==false);//false 3 console. ...