SPOJ Distinct Substrings
给定一个字符串,求不相同子串个数。
每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同子串个数。
总数为n*(n-1)/2,再减掉height[i]的和就是答案
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e6+;
int sa[maxn];
int t1[maxn];
int t2[maxn];
int c[maxn];
int rk[maxn];
int height[maxn];
void build_sa (int s[],int n,int m) {
int i,j,p;
int *x=t1,*y=t2;
for (i=;i<m;i++) c[i]=;
for (i=;i<n;i++) c[x[i]=s[i]]++;
for (i=;i<m;i++) c[i]+=c[i-];
for (i=n-;i>=;i--) sa[--c[x[i]]]=i;
for (j=;j<=n;j<<=) {
p=;
for (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<m;i++) c[i]=;
for (i=;i<n;i++) c[x[y[i]]]++;
for (i=;i<m;i++) c[i]+=c[i-];
for (i=n-;i>=;i--) sa[--c[x[y[i]]]]=y[i];
swap(x,y);
p=;
x[sa[]]=;
for (i=;i<n;i++)
x[sa[i]]=y[sa[i-]]==y[sa[i]]&&y[sa[i-]+j]==y[sa[i]+j]?p-:p++;
if (p>=n) break;
m=p;
}
}
void getHeight (int s[],int n) {
int i,j,k=;
for (i=;i<=n;i++) rk[sa[i]]=i;
for (i=;i<n;i++) {
if (k) k--;
j=sa[rk[i]-];
while (s[i+k]==s[j+k]) k++;
height[rk[i]]=k;
}
}
bool check (int n,int k,int t) {
int num=;
for (int i=;i<=n;i++) {
if (height[i]>=t) {
num++;
if (num>=k) return true;
}
else num=;
}
return false;
}
char str[maxn];
int s[maxn];
int main () {
int T;
scanf ("%d",&T);
while (T--) {
scanf ("%s",str);
int n=strlen(str);
for (int i=;i<=n;i++) s[i]=str[i];
build_sa(s,n+,);
getHeight(s,n);
int ans=n*(n+)/;
for (int i=;i<=n;i++) ans-=height[i];
printf ("%d\n",ans);
}
return ;
}
SPOJ Distinct Substrings的更多相关文章
- SPOJ Distinct Substrings(后缀数组求不同子串个数,好题)
DISUBSTR - Distinct Substrings no tags Given a string, we need to find the total number of its dist ...
- SPOJ Distinct Substrings【后缀数组】
Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...
- spoj - Distinct Substrings(后缀数组)
Distinct Substrings 题意 求一个字符串有多少个不同的子串. 分析 又一次体现了后缀数组的强大. 因为对于任意子串,一定是这个字符串的某个后缀的前缀. 我们直接去遍历排好序后的后缀字 ...
- SPOJ - Distinct Substrings,求不同的字串个数!
DISUBSTR - Distinct Substrings 题意:给你一个长度最多1000的字符串,求不相同的字串的个数. 思路:一个长度为n的字符串最多有(n+1)*n/2个,而height数组已 ...
- SPOJ Distinct Substrings SA
正解:SA 解题报告: 传送门! 啊先给个翻译趴QwQ大概就是说给个字符串,求互不相等的子串的个数 算是道小水题辣趴,,,并不难想到的呢QAQ只是因为是新知识所以巩固下而已QAQ 然后就显然考虑合法方 ...
- spoj Distinct Substrings 后缀数组
给定一个字符串,求不相同的子串的个数. 假如给字符串“ABA";排列的子串可能: A B A AB BA ABA 共3*(3+1)/2=6种; 后缀数组表示时: A ABA BA 对于A和 ...
- SPOJ 694. Distinct Substrings (后缀数组不相同的子串的个数)转
694. Distinct Substrings Problem code: DISUBSTR Given a string, we need to find the total number o ...
- 【SPOJ】Distinct Substrings(后缀自动机)
[SPOJ]Distinct Substrings(后缀自动机) 题面 Vjudge 题意:求一个串的不同子串的数量 题解 对于这个串构建后缀自动机之后 我们知道每个串出现的次数就是\(right/e ...
- 【SPOJ】Distinct Substrings/New Distinct Substrings(后缀数组)
[SPOJ]Distinct Substrings/New Distinct Substrings(后缀数组) 题面 Vjudge1 Vjudge2 题解 要求的是串的不同的子串个数 两道一模一样的题 ...
随机推荐
- JavaScript的严格检查模式
JavaScript的严格检查模式 前提:IDEA设置为ECMAScript 6语法. 'use strict':严格检查模式,用来预防JS的随意性导致的问题. 比如:直接 i=1;这样定义成了全局变 ...
- OERR: ORA-32004 "obsolete or deprecated parameter(s) specified for %s instance"
Oracle 11gR2通过Memory创建动态参数文件后,通过SPFILE启动,提示 ORA-32004: obsolete or deprecated parameter(s) specified ...
- asp.net使用wsdl文件调用接口,以及调用SSL接口报错“根据验证过程 远程证书无效”的处理
1.调用wsdl接口,首先需要将wsdl文件转换为cs文件: 进入VS 开发人员命令提示行,输入如下命令: c:/Program Files/Microsoft Visual Studio 8/VC& ...
- jvm(2):垃圾收集和内存分配
typora-root-url: ./ 垃圾收集 垃圾收集器关注的是线程共享的这部分内存. jvisualvm用来监控JVM的运行情况,可以用它来查看和浏览Heap Dump.Thread Dump. ...
- AcWing 104. 货仓选址
#include <iostream> #include <algorithm> using namespace std; ; int n; int q[N]; int mai ...
- 路飞-celery框架
Celery 官方 Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/la ...
- 题解【洛谷P5315】头像上传
本题就是按照题目模拟, 只是要注意一些细节问题. Wrong Answer的主要有以下2个问题: 注意这句话: 在图片上传前,系统会对图片进行如下处理:如果图片的任何一边长度超过了 G ,那么系统会不 ...
- 【常识】常用RGB颜色对照表
RGB颜色表 白色:rgb(255,255,255) 黑色:rgb(0,0,0) 红色:rgb(255,0,0) 绿色:rgb(0,255,0) 蓝色:rgb(0,0,255) 青色:rgb(0,25 ...
- HTML学习(8)超链接
<a href="url">链接文本或图片</a> 可以使用id属性来访问标记的地方,例: <a id="tip">被访问的 ...
- css transform 2D3D转换
2D转换 translate 移动 <style> div{ width: 100px; height: 100px; } .box{ border: 1px dashed red; fl ...