题面

初见广义SAM

建立广义SAM,每次把询问走一遍,最终走到节点的子树里的猫老师都被这次点名点到

这样DFS parent树打时间戳记录入栈出栈时间,把问题转化成一个序列问题:给一个若干种颜色构成的序列和一些区间,询问:

1.每个区间里有多少种颜色— —直接莫队

2.每种颜色被多少区间包含— —同样是莫队,当某种颜色消失时从它上次出现开始的区间到现在的区间都包含了它

 #include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int N=;
struct a
{
int l,r;
int idx,blo;
}q[N];
unordered_map<int,int> trs[N];
int fth[N],len[N],bel[N];
int p[N],noww[N],goal[N];
int ins[N],ots[N],col[N];
int qry[N],bkt[N],las[N],ans1[N],ans2[N];
int n,m,lp,rp,ll,rd,lst,sqr,cnt,tot,dfn,ans;
bool cmp(a x,a y)
{
return x.blo==y.blo?x.r<y.r:x.blo<y.blo;
}
void Link(int f,int t)
{
noww[++cnt]=p[f];
goal[cnt]=t,p[f]=cnt;
}
void Insert(int ch)
{
int nde=lst,newn=++tot;
lst=newn,len[newn]=len[nde]+;
while(nde&&!trs[nde][ch])
trs[nde][ch]=newn,nde=fth[nde];
if(!nde)
fth[newn]=;
else
{
int tran=trs[nde][ch];
if(len[tran]==len[nde]+)
fth[newn]=tran;
else
{
int rnde=++tot;
len[rnde]=len[nde]+,trs[rnde]=trs[tran];
fth[rnde]=fth[tran],fth[tran]=fth[newn]=rnde;
while(nde&&trs[nde][ch]==tran)
trs[nde][ch]=rnde,nde=fth[nde];
}
}
}
void DFS(int nde)
{
ins[nde]=++dfn,col[dfn]=bel[nde];
for(int i=p[nde];i;i=noww[i])
DFS(goal[i]); ots[nde]=dfn;
}
void Add(int tsk,int typ)
{
if(tsk)
if(++bkt[tsk]==)
ans++,las[tsk]=typ;
}
void Delete(int tsk,int typ)
{
if(tsk)
if(!(--bkt[tsk]))
ans--,ans2[tsk]+=typ-las[tsk];
}
int main()
{
scanf("%d%d",&n,&m),tot=;
for(int i=;i<=n;i++)
{
scanf("%d",&ll),lst=;
for(int j=;j<=ll;j++)
scanf("%d",&rd),Insert(rd),bel[lst]=i;
scanf("%d",&ll),lst=;
for(int j=;j<=ll;j++)
scanf("%d",&rd),Insert(rd),bel[lst]=i;
}
for(int i=;i<=tot;i++) Link(fth[i],i);
DFS(),sqr=sqrt(tot)+;
for(int i=;i<=m;i++)
{
scanf("%d",&ll);
for(int j=;j<=ll;j++)
scanf("%d",&qry[j]);
int nde=;
for(int j=;j<=ll;j++)
{
nde=trs[nde][qry[j]];
if(!nde) break;
}
q[i].l=ins[nde],q[i].r=ots[nde];
q[i].idx=i,q[i].blo=(q[i].l-)/sqr+;
}
sort(q+,q++m,cmp),lp=,rp=;
for(int i=;i<=m;i++)
{
while(lp<q[i].l) Delete(col[lp++],i);
while(lp>q[i].l) Add(col[--lp],i);
while(rp<q[i].r) Add(col[++rp],i);
while(rp>q[i].r) Delete(col[rp--],i);
ans1[q[i].idx]=ans;
}
for(int i=lp;i<=rp;i++) Delete(col[i],m+);
for(int i=;i<=m;i++) printf("%d\n",ans1[i]);
for(int i=;i<=n;i++) printf("%d ",ans2[i]);
return ;
}

解题:SCOI 2012 喵星球上的点名的更多相关文章

  1. BZOJ 2754 SCOI 2012 喵星球上的点名 后缀数组 树状数组

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2068  Solved: 907[Submit][St ...

  2. 洛谷 P2336 [SCOI2012]喵星球上的点名 解题报告

    P2336 [SCOI2012]喵星球上的点名 题目描述 a180285 幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有 \(N\) 个喵星人,每个喵星人的 ...

  3. BZOJ_2754__[SCOI2012]_喵星球上的点名_(暴力+后缀数组)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2754 给出n个姓名串和m个点名串.求每个点名串在多少人的姓名中出现过(在名中出现或在姓中出现, ...

  4. BZOJ 2754: [SCOI2012]喵星球上的点名

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 649  Solved: 305[Submit][Sta ...

  5. BZOJ2754: [SCOI2012]喵星球上的点名

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 680  Solved: 314[Submit][Sta ...

  6. BZOJ 2754: [SCOI2012]喵星球上的点名 [后缀数组+暴力]

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1906  Solved: 839[Submit][St ...

  7. BZOJ 2754: [SCOI2012]喵星球上的点名 [AC自动机+map+暴力]

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1902  Solved: 837[Submit][St ...

  8. 【BZOJ2754】喵星球上的点名(AC自动机)

    [BZOJ2754]喵星球上的点名(AC自动机) 题面 BZOJ 题解 友情提示:此题请不要在cogs上提交,它的数据有毒 对于点名串构建\(AC\)自动机 然后把名字丢进去进行匹配, 大力统计一下答 ...

  9. P2336 [SCOI2012]喵星球上的点名(后缀自动机+莫队+dfs序)

    P2336 [SCOI2012]喵星球上的点名 名字怎么存?显然是后缀自动机辣 询问点到多少个喵喵喵其实就是 查询后缀自动机上parent树的一个子树 于是我们考虑莫队 怎么树上莫队呢 我们用dfs序 ...

随机推荐

  1. Flink BLOB架构

    Flink中支持的BLOB文件类型 jar包 被user classloader使用的jar包 高负荷RPC消息 1. RPC消息长度超出了akka.framesize的大小 2. 在HA摸式中,利用 ...

  2. 绝对干货!初学者也能看懂的DPDK解析

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由Willko发表于云+社区专栏 一.网络IO的处境和趋势 从我们用户的使用就可以感受到网速一直在提升,而网络技术的发展也从1GE/10 ...

  3. Streamr助你掌控自己的数据(3)——教你在Streamr市场上发布数据

    博客说明 所有刊发内容均可转载但是需要注明出处. 教你在Streamr市场上发布数据 本系列文档主要介绍怎么通过Streamr管理自己的DATA,整个系列包括三篇教程文档,分别是:教你5分钟上传数据至 ...

  4. CS224n-作业1

    0 前言 作业1对应的试题 作业1对应的启动代码 作业1主页 1 Softmax(10分) (a)(5分) 对于向量$x+c$的任一维度$i$,有: \begin{align*}\mbox{softm ...

  5. [机器学习]-K近邻-最简单的入门实战例子

    本篇文章分为两个部分,前一部分主要简单介绍K近邻,后一部分是一个例子 第一部分--K近邻简介 从字面意思就可以容易看出,所谓的K近邻,就是找到某个样本距离(这里的距离可以是欧式距离,曼哈顿距离,切比雪 ...

  6. vi/vim命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/mondol/p/vi-examples.html 进入vi vi filename # 打开或新建文件,并将光标置于第 ...

  7. Django_缓存

    目录 Django缓存的介绍 配置(settings.py设置不同缓存介质) 应用(全局.视图函数.模板) 实测 Django缓存的介绍 除了Django这个web框架之外.其他框架都没有缓存.Dja ...

  8. Scrum Meeting 10.30

    成员 今日任务 明日计划 用时 徐越 配置servlet环境,设计开发文档 设计开发文档,配置服务器,使得本地可以访问服务器 5h 武鑫 软件界面设计:学习使用Activity和Fragment 设计 ...

  9. angualrJs指令起名的bug

    我在写一个demo时: <div ng-repeat="user in users" my-template2 my-template> //my-template2 ...

  10. c++第七次作业____最后的总结

    先言: 在这过程中学到: 第二次作业Github的使用 第四次作业计算器的计算 ps:表达式处理以及计算 第五次作业文件的处理问题 第六次作业界面的设计 总结: 1.这学期的计算器,做的有点匆忙,偶尔 ...