Description

(我并不想告诉你题目名字是什么鬼)

有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n].

现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始位置来表示),求这些后缀两两之间的LCP(LongestCommonPrefix)的长度之和.一对后缀之间的LCP长度仅统计一遍.

Input

第一行两个正整数n,m,分别表示S的长度以及询问的次数.

接下来一行有一个字符串S.

接下来有m组询问,对于每一组询问,均按照以下格式在一行内给出:

首先是一个整数t,表示共有多少个后缀.接下来t个整数分别表示t个后缀在字符串S中的出现位置.

Output

对于每一组询问,输出一行一个整数,表示该组询问的答案.由于答案可能很大,仅需要输出这个答案对于23333333333333333(一个巨大的质数)取模的余数.
建出后缀树,询问相当于后缀树上一些点间两两的lca的深度之和,建出虚树然后树形dp求解
#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的更多相关文章

  1. ●BZOJ 3879 SvT

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3879 题解: 后缀数组,单调栈,RMQ 其实类似 BZOJ 3238 [Ahoi2013]差 ...

  2. BZOJ 3879: SvT [虚树 后缀树]

    传送门 题意: 多次询问,给出一些后缀,求两两之间$LCP$之和 哈哈哈哈哈哈哈竟然$1A$了,刚才还在想如果写不好这道题下节数学就不上了,看来是上天让我上数学课啊 $Suffix\ Virtual\ ...

  3. BZOJ 3879: SvT 虚树 + 后缀自动机

    Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始 ...

  4. 【BZOJ 3879】SvT

    http://www.lydsy.com/JudgeOnline/problem.php?id=3879 SvT的中文是后缀虚树? 反正本蒟蒻不懂,还是$O(nlogn)$的后缀数组和单调栈维护来做, ...

  5. bzoj 3879 虚树

    题目大意: 给一个字符串,多次询问k个后缀,求它们两两间LCP长度总和 分析: 转化为后缀树,用虚树求 注意: 后缀树中代表后缀的点都是叶子节点 题目中取模并没有卵用 #include <cst ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. Week Four

    2018.12.18 1.[USACO Platinum C] 2.[Gym 102028H] 3.[BZOJ 2750] 4.[BZOJ 3238] 5.[BZOJ 4310] 6.[BZOJ 38 ...

  8. Week Five

    2018.12.25 1.[BZOJ 4310] 2.[BZOJ 3879] 3.[BZOJ 2754] 4.[BZOJ 4698] 5.[Codeforces 914E] 6.[Codeforces ...

  9. HDU 3879 && BZOJ 1497:Base Station && 最大获利 (最大权闭合图)

    http://acm.hdu.edu.cn/showproblem.php?pid=3879 http://www.lydsy.com/JudgeOnline/problem.php?id=1497 ...

随机推荐

  1. spring Boot加载bean

    1.SpringBoot中加载bean,可以使用注解@compenent直接加载到applicationContext容器中 2.在直接类@Configuration中,手动注册bean,如:

  2. 路由器实操 能够登陆QQ 收发信息正常 但游览器无法连接网页

    这种情况下,网络是没有问题的. ping www.baidu.com 失败,但是能上QQ说明网络没有问题:这一般是域名解析DNS的问题. 游览器登陆192.168.1.1.输入用户密码,均为admin ...

  3. 使用 Git Hook 自动部署 Hexo 到个人 VPS

    安装 Hexo 既然我的标题都已经那样写了,当然这个小节就不是本篇文章的重点了. 关于 Hexo 的安装跟配置,其实网上已经有很多很多文章了,随便一搜一大把.这里就有一篇超详细的,大家可以参考一下. ...

  4. ES5和ES6中的继承

    看到一篇写的非常好的关于js继承的文章,其中对构造函数.原型.实例之间的关系的描述十分透彻,故转载作者文章以随时学习,并供大家共同进步! ES5 ES5中的继承,看图: function Super( ...

  5. PowerDesigner16工具学习笔记-建立BPM

    根据不同用途,BPM分为分析性(Analysis).执行型(Executable)和协作型(Collaborative) BPM的类型 业务流程语言 描述  分析型  Analysis  提供流程层次 ...

  6. Linux CentOS7.0下JAVA安装和配置环境变量

    一.前言: CentOS7.0虽然自带JDK1.7和1.8,运行“java -version”命令也可以看到版本信息,但是jdk的安装环境不全,比如缺少tool.jar和dt.jar等,这就导致“ja ...

  7. 玲珑杯 round18 A 计算几何瞎暴力

    题目链接 : http://www.ifrog.cc/acm/problem/1143 当时没看到坐标的数据范围= =看到讨论才意识到,不同的坐标最多只有1k多个,完全可以暴力做法,不过也要一些技巧. ...

  8. 基于Oracle的SQL优化(崔华著)-整理笔记-工具集

    一.脚本display_cursor_9i.sql是可以得到SQL的真实执行计划,使用示例 使用示例,请看以下case 1.执行测试sql: SELECT T1.*,T2.* FROM T_0504 ...

  9. MySQL中视图和普通表的区别

    1.视图是数据库数据的特定子集.可以禁止所有用户访问数据库表,而要求用户只能通过视图操作数据,这种方法可以保护用户和应用程序不受某些数据库修改的影响. 2.视图是抽象的,他在使用时,从表里提取出数据, ...

  10. idea配置echache.xml报错Cannot resolve file 'ehcache.xsd'

    解决方法: 打开settings->languages&frameworks->schemas and dtds ,添加地址 http://ehcache.org/ehcache. ...