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 ...
随机推荐
- TC 配置插件
转载:http://hi.baidu.com/accplaystation/item/07534686f39dc329100ef310 1.插件下载地址:http://www.topcoder.com ...
- redis高可用 - redis集群
redis-sentinel方案提供了单点的高可用解决方案,但是当数据量和业务量极速增长时,单点的reids不可能无限的纵向扩容(增大内存),这个时候就需要redis有集群的能力来扛. redis集群 ...
- mysql之innodb的锁分类介绍
一.innodb行锁分类 record lock:记录锁,也就是仅仅锁着单独的一行 gap lock:区间锁,仅仅锁住一个区间(注意这里的区间都是开区间,也就是不包括边界值. next-key loc ...
- MVP框架模式
一.基本概念 MVP是Model-View-Presenter的简称,即模型-视图-表现层的缩写.MVP是由MVC模式进化而来的,MVP改进了MVC中的控制器过于臃肿的问题.与MVC一样,MVP将应用 ...
- Android------视频播放器(包含全屏播放,快退,快进,腾讯新闻的列表播放等)
前段时间做了一个新闻APP,涉及到了列表视频播放,和腾讯新闻APP差不多,总结了一下代码,写了一个Demo来分享给大家. 用了 TabLayout+RecylerView+自定义视频控件 完成的 ...
- 流量监控iftop安装-CentOS7
继之前撘的服务器后路由器一直崩溃,今天找到了原因.之前被下的木马并没有被删掉,而是一直在传输数据.占用了所有宽带. 官网(http://www.ex-parrot.com/pdw/iftop/down ...
- Java实现ping功能的三种方法及Linux的区分
前大半部份转自:https://blog.csdn.net/futudeniaodan/article/details/52317650 检测设备的运行状态,有的是使用ping的方式来检测的.所以需要 ...
- CF86D
题解: 莫队分块 分块大小为sqrt(n) 代码: #include<bits/stdc++.h> using namespace std; ; typedef long long ll; ...
- java基础11天
冒泡排序 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处,第二次比较厚,最大值放在了倒数第二的位置,一直到第二个元素确定了,整个数组的顺序也就确定了 public class Ar ...
- JSP Unable to compile class for JSP
今天刚弄好MyEclipse环境,试了一下jsp的创建,然后就出现了一个很令人纠结的问题. 文档目录如下: Jsp代码如下: <%@page import="com.pd.Person ...