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 2012遇到“需要更新的以前的Visual Studio 2010实例.”
Microsoft Visual Studio 2010 Service Pack 1(exe) 下载链接:http://www.microsoft.com/zh-cn/download/confir ...
- 重写equals()方法时,需要同时重写hashCode()方法
package com.wangzhu.map; import java.util.HashMap; /** * hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,<br/&g ...
- dbgrid显示access备注信息
procedure TfrmAllFind.DBGrid6DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; C ...
- Apache与Tomcat整合
Apache与Tomcat整合 一 Apache与Tomcat比较联系 apache支持静态页,tomcat支持动态的,比如servlet等. 一般使用apache+tomcat的话,apache ...
- HTML5入门4---HTML5 与 HTML4 同一网页的不同写法
HTML4写法 css: body { font-family: "Lucida Sans Unicode", "Lucida Grande", Verdana ...
- Android listview的item设定高度
在item的layout文件中,用android:layout_height设置item的高度.运行,高度设置无效. 解决办法: 给item设定minHeight,即可. -------------- ...
- JBoss - 调整JVM内存 -Xms512m -Xmx1024m
$JBOSS-HOME/server/下有3个目录,all/default/minimal,它们是表示3种配置,全部的配置.默认配置.最小配置,我们在启动JBOSS服务时,可以指定 run –c al ...
- 机器学习 —— 概率图模型(CPD)
CPD是conditional probability distribution的缩写,翻译成中文叫做 条件概率分布.在概率图中,条件概率分布是一个非常重要的概念.因为概率图研究的是随机变量之间的练习 ...
- Maven是如何工作的
Maven的依赖机制能够自动下载依赖文件,并且自动维护.更新版本. 让我们通过一个案例来了解Maven是如何工作的,假如你的系统想用log4j作为日志输出工具,让我们看一下传统做法和Maven做法: ...
- MATLAB曲线绘制
一. 二维数据曲线图1.1 绘制 单根二维曲线plot 函数的基本调用 格式为:plot(x,y) 其中x和y为长度相同的向量,分别用于存储x坐标 和y坐标数据. 例1-1 在0≤x≤2p区间内,绘制 ...