bzoj 3879: SvT
Description
(我并不想告诉你题目名字是什么鬼)
有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n].
现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始位置来表示),求这些后缀两两之间的LCP(LongestCommonPrefix)的长度之和.一对后缀之间的LCP长度仅统计一遍.
Input
第一行两个正整数n,m,分别表示S的长度以及询问的次数.
接下来一行有一个字符串S.
接下来有m组询问,对于每一组询问,均按照以下格式在一行内给出:
首先是一个整数t,表示共有多少个后缀.接下来t个整数分别表示t个后缀在字符串S中的出现位置.
Output
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long i64;
const int N=1e6+;
char s[N];
int nx[N][],l[N],fa[N],pp=,pv=;
int n,m,pos[N];
int e0[N],es[N],enx[N],ep=,sz[N],son[N],dep[N],top[N],id[N][],idp=,ss[N],sp=;
int ed[N],tk=;
char buf[],*ptr=buf-;
int _(){
int x=;
while(*ptr<)++ptr;
while(*ptr>)x=x*+*ptr++-;
return x;
}
void _(char*s){
while(*ptr<)++ptr;
while(*ptr>)*s++=*ptr++;
*ptr=;
}
int ins(int x){
int p=pv,np=++pp;
l[np]=l[p]+;
while(p&&!nx[p][x])nx[p][x]=np,p=fa[p];
if(!p)fa[np]=;
else{
int q=nx[p][x];
if(l[q]==l[p]+)fa[np]=q;
else{
int nq=++pp;
l[nq]=l[p]+;
memcpy(nx[nq],nx[q],sizeof(nx[]));
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
while(p&&nx[p][x]==q)nx[p][x]=nq,p=fa[p];
}
}
return pv=np;
}
void push(int w){
ss[++sp]=w;
id[w][]=++idp;
dep[w]=dep[fa[w]]+;
}
void hld_pre(){
for(int i=;i<=pp;++i){
es[ep]=i;enx[ep]=e0[fa[i]];e0[fa[i]]=ep++;
sz[i]=;
}
push();
while(sp){
int w=ss[sp],&e=e0[w];
if(!e){
int f=fa[w];
sz[f]+=sz[w];
if(w[sz]>f[son][sz])f[son]=w;
id[w][]=idp;
--sp;
continue;
}
int u=es[e];
e=enx[e];
push(u);
}
for(int i=;i<=pp;++i)if(i[fa][son]!=i){
for(int w=i;w;w=w[son])w[top]=i;
}
}
int lca(int x,int y){
int a=top[x],b=top[y];
while(a!=b){
if(dep[a]>dep[b])x=fa[a],a=top[x];
else y=fa[b],b=top[y];
}
return dep[x]<dep[y]?x:y;
}
bool cmp(int a,int b){
return id[a][]<id[b][];
}
int cs[N],cp,tp[N],_f[N];
void cal(){
i64 ans=;
int p=;
_f[ss[++sp]=cs[p++]]=;
while(sp){
int w=ss[sp];
if(p<cp&&id[cs[p]][]<=id[w][])_f[ss[++sp]=cs[p++]]=w;
else{
--sp;
int f=_f[w];
if(f>){
ans+=i64(l[f])*tp[f]*tp[w];
tp[f]+=tp[w];
}
}
}
printf("%lld\n",ans);
}
int main(){
fread(buf,,sizeof(buf),stdin)[buf]=;
n=_();m=_();
_(s+);
for(int i=n;i;--i)pos[i]=ins(s[i]-'a');
hld_pre();
for(int c;m;--m){
c=_();
cp=;
++tk;
for(int i=,x;i<c;++i){
x=pos[_()];
if(ed[x]!=tk)ed[cs[cp++]=x]=tk,tp[x]=;
}
std::sort(cs,cs+cp,cmp);
c=cp;
for(int i=,pv=;i<c;++i){
int x=lca(cs[i],pv);
pv=cs[i];
if(ed[x]!=tk)ed[cs[cp++]=x]=tk,tp[x]=;
}
std::sort(cs,cs+cp,cmp);
cal();
}
return ;
}
bzoj 3879: SvT的更多相关文章
- ●BZOJ 3879 SvT
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3879 题解: 后缀数组,单调栈,RMQ 其实类似 BZOJ 3238 [Ahoi2013]差 ...
- BZOJ 3879: SvT [虚树 后缀树]
传送门 题意: 多次询问,给出一些后缀,求两两之间$LCP$之和 哈哈哈哈哈哈哈竟然$1A$了,刚才还在想如果写不好这道题下节数学就不上了,看来是上天让我上数学课啊 $Suffix\ Virtual\ ...
- BZOJ 3879: SvT 虚树 + 后缀自动机
Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始 ...
- 【BZOJ 3879】SvT
http://www.lydsy.com/JudgeOnline/problem.php?id=3879 SvT的中文是后缀虚树? 反正本蒟蒻不懂,还是$O(nlogn)$的后缀数组和单调栈维护来做, ...
- bzoj 3879 虚树
题目大意: 给一个字符串,多次询问k个后缀,求它们两两间LCP长度总和 分析: 转化为后缀树,用虚树求 注意: 后缀树中代表后缀的点都是叶子节点 题目中取模并没有卵用 #include <cst ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Week Four
2018.12.18 1.[USACO Platinum C] 2.[Gym 102028H] 3.[BZOJ 2750] 4.[BZOJ 3238] 5.[BZOJ 4310] 6.[BZOJ 38 ...
- Week Five
2018.12.25 1.[BZOJ 4310] 2.[BZOJ 3879] 3.[BZOJ 2754] 4.[BZOJ 4698] 5.[Codeforces 914E] 6.[Codeforces ...
- HDU 3879 && BZOJ 1497:Base Station && 最大获利 (最大权闭合图)
http://acm.hdu.edu.cn/showproblem.php?pid=3879 http://www.lydsy.com/JudgeOnline/problem.php?id=1497 ...
随机推荐
- 【spring-boot】 springboot整合quartz实现定时任务
在做项目时有时候会有定时器任务的功能,比如某某时间应该做什么,多少秒应该怎么样之类的. spring支持多种定时任务的实现.我们来介绍下使用spring的定时器和使用quartz定时器 1.我们使用s ...
- supervisor安装与问题
[转]安装supervisor以及可能碰到的问题 单击此处查看原文 supervisor作为一个进程管理的python软件非常的给力 但是一不小心就会遇到一些问题 就比如下面这个: unix:///v ...
- lxml.etree去除子节点
去除etree中的某个子节点有两种方法: 1.parentnode.remove(node) 2.etree.strip_elements(html, 'element_name', with_tag ...
- TP中上传文件图片的实现
GoodsController.class.php控制器页面<?php namespace Admin\Controller; use Think\Controller; class Goods ...
- Java如何将字符串中的敏感词替换为相等数量的星号*
Java如何将字符串中的敏感词替换为相等数量的星号* Java如何将字符串中的敏感词替换为相等数量的星号*,这也是我工作中遇到的问题,尝试了很多种方式最后采用这一种,在这里分享一下我的解决方式,代码效 ...
- Win7SDK
1.ISO下载地址: http://www.microsoft.com/en-us/download/details.aspx?id=8442 2.可供下载的 版本有3个,网上搜到的解释: GRMSD ...
- 依据分辨率区分手机、平板、pc
/*手机*/ @media screen and (max-width:600px){ #header,#content,#footer{width:400px;} .right,.center{ma ...
- Java回顾之ORM框架
这篇文章里,我们主要讨论ORM框架,以及在使用上和JDBC的区别. 概述 ORM框架不是一个新话题,它已经流传了很多年.它的优点在于提供了概念性的.易于理解的数据模型,将数据库中的表和内存中的对象建立 ...
- RabbitMQ入门_03_推拉模式
我们知道,消费者有两种方式从消息中间件获取消息: 推模式:消息中间件主动将消息推送给消费者 拉模式:消费者主动从消息中间件拉取消息 推模式将消息提前推送给消费者,消费者必须设置一个缓冲区缓存这些消息. ...
- 资源管理器总是生成 avi,mpeg的预览图
感觉非常讨厌. 图片可以直接显示,但是视频的预览图感觉很不舒服. 查了一下 , 用ShellExView 禁用一下 MF XXXX Property Handler 就可以了. 官网最下面可以下载: ...