SPOJ DISUBSTR Distinct Substrings 后缀数组
题意:统计母串中包含多少不同的子串
然后这是09年论文《后缀数组——处理字符串的有力工具》中有介绍
公式如下:

原理就是加上新的,减去重的,这题是因为打多校才补的,只能说我是个垃圾
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <utility>
#include <vector>
using namespace std;
typedef long long LL;
const int N = 1e3+;
int cmp(int *r,int a,int b,int l){
return (r[a]==r[b]) && (r[a+l]==r[b+l]);
}
// ???????????????,
// ????????,??????,r[n]=0(??????????)
int wa[N],wb[N],ww[N],wv[N];
int ran[N],height[N];
void DA(int *r,int *sa,int n,int m){ //??N????N??1????????????????CMP???
int i,j,p,*x=wa,*y=wb,*t;
for(i=;i<m;i++) ww[i]=;
for(i=;i<n;i++) ww[x[i]=r[i]]++;
for(i=;i<m;i++) ww[i]+=ww[i-];
for(i=n-;i>=;i--) sa[--ww[x[i]]]=i; //??????1
for(j=,p=;p<n;j*=,m=p) //?????????J?SA???2*J?SA
{
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; //????J??????????
for(i=;i<n;i++) wv[i]=x[y[i]];
for(i=;i<m;i++) ww[i]=;
for(i=;i<n;i++) ww[wv[i]]++;
for(i=;i<m;i++) ww[i]+=ww[i-];
for(i=n-;i>=;i--) sa[--ww[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++; //??????x[],???????
}
}
void calheight(int *r,int *sa,int n){ // ??N?????
int i,j,k=; // height[]?????? 1-N, ??0????????
for(i=;i<=n;i++) ran[sa[i]]=i; // ??SA?RANK
for(i=;i<n; height[ran[i++]] = k ) // ???h[i] = height[ rank[i] ]
for(k?k--:,j=sa[ran[i]-]; r[i+k]==r[j+k]; k++); //?? h[i] >= h[i-1]-1 ?????height??
}
char s[N];
int sa[N],n,r[N],T;
int main(){
scanf("%d",&T);
while(T--){
scanf("%s",s);
n=strlen(s);
for(int i=;i<n;++i)r[i]=(int)s[i];
r[n]=;
DA(r,sa,n+,);
calheight(r,sa,n);
int ans = ;
for(int i=;i<=n;++i)
ans+=n-sa[i]-height[i];
printf("%d\n",ans);
}
return ;
}
SPOJ DISUBSTR Distinct Substrings 后缀数组的更多相关文章
- SPOJ - DISUBSTR Distinct Substrings (后缀数组)
Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...
- spoj 694. Distinct Substrings 后缀数组求不同子串的个数
题目链接:http://www.spoj.com/problems/DISUBSTR/ 思路: 每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同的前缀的个数.如果所有的后缀按照su ...
- SPOJ - SUBST1 New Distinct Substrings —— 后缀数组 单个字符串的子串个数
题目链接:https://vjudge.net/problem/SPOJ-SUBST1 SUBST1 - New Distinct Substrings #suffix-array-8 Given a ...
- 【SPOJ – SUBST1】New Distinct Substrings 后缀数组
New Distinct Substrings 题意 给出T个字符串,问每个字符串有多少个不同的子串. 思路 字符串所有子串,可以看做由所有后缀的前缀组成. 按照后缀排序,遍历后缀,每次新增的前缀就是 ...
- SPOJ 694 || 705 Distinct Substrings ( 后缀数组 && 不同子串的个数 )
题意 : 对于给出的串,输出其不同长度的子串的种类数 分析 : 有一个事实就是每一个子串必定是某一个后缀的前缀,换句话说就是每一个后缀的的每一个前缀都代表着一个子串,那么如何在这么多子串or后缀的前缀 ...
- spoj Distinct Substrings 后缀数组
给定一个字符串,求不相同的子串的个数. 假如给字符串“ABA";排列的子串可能: A B A AB BA ABA 共3*(3+1)/2=6种; 后缀数组表示时: A ABA BA 对于A和 ...
- ●SPOJ 8222 NSUBSTR - Substrings(后缀数组)
题链: http://www.spoj.com/problems/NSUBSTR/ 题解: 同届红太阳 --WSY给出的后缀数组解法!!! 首先用倍增算法求出 sa[i],rak[i],hei[i]然 ...
- [spoj694&spoj705]New Distinct Substrings(后缀数组)
题意:求字符串中不同子串的个数. 解题关键:每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同的前缀的个数. 1.总数减去height数组的和即可. 注意这里height中为什么不需 ...
- 【SPOJ】Distinct Substrings/New Distinct Substrings(后缀数组)
[SPOJ]Distinct Substrings/New Distinct Substrings(后缀数组) 题面 Vjudge1 Vjudge2 题解 要求的是串的不同的子串个数 两道一模一样的题 ...
随机推荐
- [SQL Server系] -- 基本概念
以下是我总结的 SQL Server 数据库中的一些 基本概念,以便模糊时查询, 欢迎补充 1:主键: 概念: 数据表 经常有 一个列 或 列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称 ...
- JavaC 编译目录下所有的UTF-8编码的java文件
javac -encoding UTF-8 *.java
- Openfire 代码部署报错: Variable references non-existent resource:${workspace_loc:openfire_src}
Variable references non-existent resource:${workspace_loc:openfire_src} -DopenfireHome=“${workspace_ ...
- cojs 简单的求和问题 解题报告
一个上午写了两个数据生成器,三个暴力和两个正解以及一个未竣工的伪正解思路 真是累死本宝宝了 首先这个题目暴力我的数据是有很多良心分的 但是不同的暴力拿到的分数也会有所差距,由于是题解就不说暴力怎么写了 ...
- 【nginx运维基础(3)】Nginx的编译PHP
Apache默认是把PHP作为本身的一个模块(mod_php)来运行的,而Nginx是以FastCGI方式运行的.所以使用Nginx+PHP就是直接配置为FastCGI模式. 安装PHP 下载地址: ...
- C#中用JavaScriptSerializer和Json.Net操作json格式的文件
1.json文件 2.写出对应的类 //折扣 public class Discount { public string Qty { get; set; } public string percent ...
- 90. Subsets II
题目: Given a collection of integers that might contain duplicates, nums, return all possible subsets. ...
- MyEclipse Blue Edition 6.5 注册码生成程序
import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; im ...
- [HDOJ4738]Caocao's Bridges(双联通分量,割边,tarjan)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 给一张无向图,每一条边都有权值.找一条割边,使得删掉这条边双连通分量数量增加,求权值最小那条. ...
- devDependencies和dependencies的区别
我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入到 package.json 文件里面去,比如: --save-dev --save 在 package.json 文件里面 ...