BZOJ3879: SvT

后缀数组裸题,每次的查询单调栈扫一遍就完了。为什么要写虚后缀树= =后缀数组不是自带虚树的结构么= =

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=5e5+5;
typedef int arr[N];
arr sa,r,f[19];
void pre(char*s,int n){
	static arr c,t;
	for(int i=0;i<n;++i)
		++c[s[i]];
	for(int i=1;i<127;++i)
		c[i]+=c[i-1];
	for(int i=n-1;~i;--i)
		sa[--c[s[i]]]=i;
	for(int i=1;i<n;++i)
		r[sa[i]]=r[sa[i-1]]+(s[sa[i]]!=s[sa[i-1]]);
	for(int j=1;;j<<=1){
		int k=j,m=r[sa[n-1]]+1;
		if(m==n)break;
		for(int i=0;i<j;++i)
			t[i]=n-j+i;
		for(int i=0;i<n;++i)
			if(sa[i]>=j)
				t[k++]=sa[i]-j;
		for(int i=0;i<m;++i)
			c[i]=0;
		for(int i=0;i<n;++i)
			++c[r[i]];
		for(int i=1;i<m;++i)
			c[i]+=c[i-1];
		for(int i=n-1;~i;--i)
			sa[--c[r[t[i]]]]=t[i];
		for(int i=0;i<n;++i)
			t[i]=r[i];
		r[sa[0]]=0;
		for(int i=1;i<n;++i)
			r[sa[i]]=r[sa[i-1]]+(t[sa[i]]!=t[sa[i-1]]||t[sa[i]+j]!=t[sa[i-1]+j]);
	}
}
bool foo(int i,int j){return r[i]<r[j];}
int ask(int i,int j){
	int k=__lg(j-i+1);
	return min(f[k][i],f[k][j-(1<<k)+1]);
}
int main(){
	int n,q,m;
	static char s[N];
	scanf("%d%d%s",&n,&q,s);
	pre(s,n+1);
	for(int i=0,j=0;i<n;++i){
		if(j)--j;
		while(s[i+j]==s[sa[r[i]-1]+j])
			++j;
		f[0][r[i]]=j;
	}
	for(int j=1;1<<j<n;++j)
		for(int i=1;i+(1<<j)-1<=n;++i)
			f[j][i]=min(f[j-1][i],f[j-1][i+(1<<j-1)]);
	while(q--){
		static arr a,h,t;
		static ll z[N];
		scanf("%d",&m);
		for(int j=0;j<m;++j)
			scanf("%d",a+j),--a[j];
		sort(a,a+m,foo);
		m=unique(a,a+m)-a;
		for(int j=1;j<m;++j)
			h[j]=ask(r[a[j-1]]+1,r[a[j]]);
		h[m]=-1;
		for(int j=0;j<m;++j)
			z[j]=1;
		ll e=0;
		for(int i=0,j=1;j<=m;++j){
			for(;i&&h[j]<=h[t[i]];--i){
				e+=h[t[i]]*z[t[i-1]]*z[t[i]];
				z[t[i-1]]+=z[t[i]];
			}
			t[++i]=j;
		}
		printf("%lld\n",e);
	}
}

  

时间: 2024-10-09 15:00:09

BZOJ3879: SvT的相关文章

【BZOJ3879】SvT 后缀树+虚树

转载请注明出处谢谢:http://blog.csdn.net/vmurder/article/details/42806431 SVT什么意思? suffix virtual tree. 没有错!后缀虚树 好了,下面发一段以前的文字. 话说其实后缀数组分治能写,当时想shei了. Vn: 啊,水题. 一看到"后缀"和这数据范围,肯定后缀数组.后缀自动机.后缀树走起! 然后我们可以轻松构造出来一个后缀树,然后每次询问树形DP随便乱搞就能过了.但是这个时候显然会TLE,所以我们可以尝试利用

【BZOJ 3879】SvT

http://www.lydsy.com/JudgeOnline/problem.php?id=3879 SvT的中文是后缀虚树? 反正本蒟蒻不懂,还是$O(nlogn)$的后缀数组和单调栈维护来做,fye学姐讲了这种学法(当时并没有听懂QwQ),xiaoyimi教会了我这种做法→xiaoyimi的题解. 一开始贡献了2次TLE,以为是玄学的死循环,果断挂起对拍器拍了一晚上,然后在回家的路上才想起来TLE是因为提交的时候忘删freopen了 #include<cstdio> #include&

BZOJ 3879 SvT 后缀树+虚树

题目大意:给出一个字符串,给出一些询问,每次问几个后缀两两之间的LCP之和. 思路:保证Σask数量级在O(n)上,可以考虑一下虚树了.建立虚树之后,这题就和差异那个题一样了.但是必须要打时间戳啊,要不死的很惨的啊.. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 1000010 using namespace s

bzoj3879

后缀数组+st表+单调栈 这道题是差异的加强版 看起来和差异差不多,但是询问的位置是不连续的,那么我们让他们连续就行. 把每个位置赋成rank值,因为lcp[i]表示rank=i和i+1的最长公共前缀,然后st表处理出相邻两个rank的lcp值,然后和差异一样,单调栈处理最左端和最右端的区间,乘起来就可以了. 注意要去重,而且不用模 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N =

Educational Codeforces Round 53 (Rated for Div. 2)G. Yet Another LCP Problem

题意:给串s,每次询问k个数a,l个数b,问a和b作为后缀的lcp的综合 题解:和bzoj3879类似,反向sam日神仙...lcp就是fail树上的lca.把点抠出来建虚树,然后在上面dp即可.(感觉之前写的svt什么玩意) //#pragma GCC optimize(2) //#pragma GCC optimize(3) //#pragma GCC optimize(4) //#pragma GCC optimize("unroll-loops") //#pragma comm

[转]UT-IT-ST-BBIT-SDV-SIT-SVT

V模型体现了设计分层和测试分层的概念,本文以作者自身的理解谈谈测试执行分层,不过从实际项目运作情况来看,真正做到测试执行分层的并不多,这里原因有很多种,暂且不论. 1. UT 单元测试(Unit Test)的对象是LLD中所划分定义的程序单元或模块,它也是单元测试用例设计中可测试的最大单元.该测试对象可能由一个或多个函数(一般就一个函数,涉及函数调用的就用AMOCK打桩返回一个值 zyq)或者类组成,测试设计就是对测试对象进行测试用例设计. UT的目的,是通过函数运行来检查模块代码对于LLD文档

各种音视频编解码学习详解

各种音视频编解码学习详解 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等.最近因为项目的关系,需要理清媒体的codec,比较搞的是,在豆丁网上看运营商的规范 标准,同一运营商同样的业务在不同文档中不同的要求,而且有些要求就我看来应当是历史的延续,也就是现在已经很少采用了.所以豆丁上看不出所以然,从 wiki上查.中文的wiki信息量有限,很短,而wiki的英文内容内多,删减版

IPD术语

集成产品开发(Integrated Product Development,简称IPD)是一套产品开发的模式.理念与方法. ABC 基于活动的成本核算 ABM 基于活动的管理 ADCP  可获得性决策评审点  APP  造型设计师 ASS  辅助设计工程师 BBFV 构建模块功能验证 BMC   生产物料成本  BR&IT 业务变革和信息技术 CBB 共用基础模块 CBB  共用基础模块  CCB  变更控制委员会  CDCP  概念决策评审点  CDP 并行开发流程 CEG  采购专家团  C

ODC(Orthogonal Defect Classification)简介——正交缺陷分类法

Defect分析是软件开发和测试中一个重要的环节,ODC介绍了一种不同于大家常用的非常有效的defect分类及分析方法.这篇文章简单的向大家介绍了什么是ODC,以及如何在项目和产品开发中使用ODC来改进开发测试流程从而增强产品质量.希望读者具有基本的软件开发和测试经验,并且了解defect分析的基本方法. Defect 分类帮助改进产品质量 软件开发中都包含有控制软件开发的流程.我们设计模块.开发代码.对产品进行测试.然后发布产品.但是,我们怎样从以前的错误中学习,怎样做得更好呢?一般情况下,我