解题:SCOI 2012 喵星球上的点名
初见广义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 喵星球上的点名的更多相关文章
- BZOJ 2754 SCOI 2012 喵星球上的点名 后缀数组 树状数组
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2068 Solved: 907[Submit][St ...
- 洛谷 P2336 [SCOI2012]喵星球上的点名 解题报告
P2336 [SCOI2012]喵星球上的点名 题目描述 a180285 幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有 \(N\) 个喵星人,每个喵星人的 ...
- BZOJ_2754__[SCOI2012]_喵星球上的点名_(暴力+后缀数组)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2754 给出n个姓名串和m个点名串.求每个点名串在多少人的姓名中出现过(在名中出现或在姓中出现, ...
- BZOJ 2754: [SCOI2012]喵星球上的点名
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 649 Solved: 305[Submit][Sta ...
- BZOJ2754: [SCOI2012]喵星球上的点名
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 680 Solved: 314[Submit][Sta ...
- BZOJ 2754: [SCOI2012]喵星球上的点名 [后缀数组+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1906 Solved: 839[Submit][St ...
- BZOJ 2754: [SCOI2012]喵星球上的点名 [AC自动机+map+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1902 Solved: 837[Submit][St ...
- 【BZOJ2754】喵星球上的点名(AC自动机)
[BZOJ2754]喵星球上的点名(AC自动机) 题面 BZOJ 题解 友情提示:此题请不要在cogs上提交,它的数据有毒 对于点名串构建\(AC\)自动机 然后把名字丢进去进行匹配, 大力统计一下答 ...
- P2336 [SCOI2012]喵星球上的点名(后缀自动机+莫队+dfs序)
P2336 [SCOI2012]喵星球上的点名 名字怎么存?显然是后缀自动机辣 询问点到多少个喵喵喵其实就是 查询后缀自动机上parent树的一个子树 于是我们考虑莫队 怎么树上莫队呢 我们用dfs序 ...
随机推荐
- 六大iT公司的组织结构
- redis使用Jackson2JsonRedisSerializer序列化问题
一.spring boot 集成Redis方法 依赖 <!--redis--> <dependency> <groupId>org.springframework. ...
- 关于nodejs中遇到mysql默认8小时连接断开机制的终极简单解决方案
由于mysql默认8小时连接无访问,就会断开.为此查了一下资料,有同种比较简单的解决方案: 1. 增加 MySQL 的 wait_timeout 属性的值. 修改 /etc/mysql/my.cnf文 ...
- 20181023-11 Alpha发布
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2283 文案: Learning by Playing 界面清爽明快,UI ...
- 第九次psp例行报告
本周psp 本周进度条 代码累积折线图 博文字数累积折线图 饼状图
- jQuery获取复选框选中的每一个值
$('input[name="serviceMode"]:checked').each(function(){ this.attr('value') });
- 20135234mqy
北京电子科技学院(BESTI) 实 验 报 告 课程:Java实验 班级:1352 姓名: mqy 学号:20135234 成绩: 指导教师 ...
- 奔跑吧DKY——团队Scrum冲刺阶段-Day 1-领航
各个成员在 Alpha 阶段认领的任务 修改 序号 修改 具体描述 1 游戏过程 取消原来的跳跃和俯身按钮,保留跳跃的功能,可以触屏滑动来躲避地面障碍物,也可以躲避另一种陷阱障碍物 2 闯关功能 取消 ...
- Hibernate笔记④--一级二级缓存、N+1问题、saveorupdate、实例代码
一级缓存及二级缓存 一级缓存也是Session 缓存 一个链接用户的多次查询使用缓存 跨用户 则无缓存 hibernate自带的 get和load都会填充并利用一级缓存 二级缓 ...
- Oracle 的四种连接-左外连接、右外连接、内连接、全连接
今天在看一个遗留系统的数据表的时候发现平时查找的视图是FULL OUT JOIN的,导致平时的数据记录要进行一些限制性处理,其实也可以设置视图各表为右外连接并在视图上设置各列的排序和筛选条件就可以 ...