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 题解 要求的是串的不同的子串个数 两道一模一样的题 ...
随机推荐
- hdu 3951 Coin Game 博弈论
思路: 当n<=k时,先手必胜: 当k=1时,n为奇数先手胜,否则后手胜: 当k>1时,先手操作之后必定形成链,后手操作后形成二条一样的链,之后,先手怎么操作,后手就怎么操作,则后手必胜. ...
- ios 关于StoryBoard 的简易使用说明
ios 关于StoryBoard 的简易使用说明 http://www.tuicool.com/articles/FNRruy
- 【PHPsocket编程专题(实战篇③)】构建基于socket的HTTP请求类
该代码是两年前写的,现在看起来有点渣了,仅仅是提供一个思路,现在做一些Api开发的时候官方会有一些SDK,这些SDK其实原理都是通过socket来通讯的,其实我个人主张用curl更方便,当然前提是你的 ...
- HTTP会话原理解释与应用
一.什么是会话 首先解释一下什么是会话.在计算机术语中,会话是指一个终端用户与交互系统进行通讯的过程,比如从输入账户密码进入操作系统到退出操作系统就是一个会话过程.会话较多用于网络上,TCP的三次握手 ...
- 控制CPU占用率曲线
编程之美的第一个问题,我的机器是双核的,用文中的代码,得到的曲线波动比较大额,受其他进程的影响比较大.文中提到10ms接近windows的调度时间片,如果选得太小,会造成线程被频繁唤醒和挂起,造成内核 ...
- csh与bash比较
csh与bash比较:一.csh的while循环控制结构及if then:#!/bin/csh -fwhile ($#argv >= 1) if ("$1" == &quo ...
- maven小项目注册服务(二)--captcha模块
验证码生成模块,配置信息基本和前面的模块一样.account-captcha需要提供的服务是生成随机的验证码主键,然后用户可以使用这个主键要求服务生成一个验证码图片,这个图片对应的值应该是随机的,最后 ...
- JVM学习笔记(一)------基本结构
从Java平台的逻辑结构上来看,我们可以从下图来了解JVM: 从上图能清晰看到Java平台包含的各个逻辑模块,也能了解到JDK与JRE的区别 对于JVM自身的物理结构,我们可以从下图鸟瞰一下: 对于J ...
- java 菱形
//画菱形 一半 for(int hs=1;hs<11;hs++) //行数 { //画空格 for(int kg = 9; kg >= hs; kg--) //空格数 { System. ...
- 使用git对unity3d项目进行版本控制
http://stackoverflow.com/questions/18225126/how-to-use-git-for-unity-source-control The following is ...