P2336 [SCOI2012]喵星球上的点名

题目描述

a180285 幸运地被选做了地球到喵星球的留学生。他发现喵星人在上课前的点名现象非常有趣。

假设课堂上有 \(N\) 个喵星人,每个喵星人的名字由姓和名构成。喵星球上的老师会选择 \(M\) 个串来点名,每次读出一个串的时候,如果这个串是一个喵星人的姓或名的子串,那么这个喵星人就必须答到。

然而,由于喵星人的字码过于古怪,以至于不能用 ASCII 码来表示。为了方便描述,a180285 决定用数串来表示喵星人的名字。

现在你能帮助 a180285 统计每次点名的时候有多少喵星人答到,以及 \(M\) 次点名结束后每个喵星人答到多少次吗?

输入输出格式

输入格式:

现在定义喵星球上的字符串给定方法:

先给出一个正整数 \(L\) ,表示字符串的长度,接下来\(L\)个整数表示字符串的每个字符。

输入的第一行是两个整数 \(N\) 和 \(M\)。

接下来有 \(N\) 行, 每行包含第 \(i\) 个喵星人的姓和名两个串。 姓和名都是标准的喵星球上的字符串。

接下来有 \(M\) 行,每行包含一个喵星球上的字符串,表示老师点名的串。

输出格式:

对于每个老师点名的串输出有多少个喵星人应该答到。

然后在最后一行输出每个喵星人被点到多少次。

说明

\(n\le 5\times 10^4,m\le 10^5\),串总长\(\le 10^5\)


先建广义SAM

发现点名是子树问题,转换到dfs序

第一问就是区间求颜色数,第二问是统计每种颜色被多少区间覆盖。

用莫队就可以了,在新加入颜色和删去颜色的时候处理一下就行了。


Code:

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
const int N=2e5+10;
std::map <int,int> ch[N];
int col[N],par[N],len[N],las=1,tot=1,id;
void extend(int c)
{int now=++tot,p=las;len[now]=len[p]+1,col[now]=id;while(p&&!ch[p][c]) ch[p][c]=now,p=par[p];if(!p) par[now]=1;else{int x=ch[p][c];if(len[x]==len[p]+1) par[now]=x;else{int y=++tot;len[y]=len[p]+1,par[y]=par[x],col[y]=id,ch[y]=ch[x];while(p&&ch[p][c]==x) ch[p][c]=y,p=par[p];par[now]=par[x]=y;}}las=now;
}
int head[N],to[N],Next[N],cnt;
void add(int u,int v)
{to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
int dfn[N],low[N],ha[N],dfsclock,n,m,m_;
void dfs(int now)
{ha[dfn[now]=++dfsclock]=now;for(int i=head[now];i;i=Next[i]) dfs(to[i]);low[now]=dfsclock;
}
struct node
{int id,l,r,fi;node(){}node(int id,int l,int r,int fi){this->id=id,this->l=l,this->r=r,this->fi=fi;}bool friend operator <(node a,node b){return a.fi==b.fi?a.l<b.l:a.fi<b.fi;}
}q[N];
int ans[N],sum[N],st[N],tax[N],su;
void add(int p)
{int c=col[ha[p]];if(!tax[c]) ++su,st[c]=id;++tax[c];
}
void del(int p)
{int c=col[ha[p]];--tax[c];if(!tax[c]) --su,sum[c]+=id-st[c];
}
int main()
{scanf("%d%d",&n,&m);for(id=1;id<=n;id++){int Len;las=1;scanf("%d",&Len);for(int c,i=1;i<=Len;i++) scanf("%d",&c),extend(c);las=1;scanf("%d",&Len);for(int c,i=1;i<=Len;i++) scanf("%d",&c),extend(c);}for(int i=2;i<=tot;i++) add(par[i],i);dfs(1);int B=sqrt(dfsclock)+1;for(int i=1;i<=m;i++){int Len,now=1;scanf("%d",&Len);for(int c,j=1;j<=Len;j++){scanf("%d",&c);now=ch[now][c];}if(now) q[++m_]=node(i,dfn[now],low[now],low[now]/B);}std::sort(q+1,q+1+m_);int l=q[1].l,r=l-1;for(id=1;id<=m_;id++){while(q[id].l<l) add(--l);while(q[id].l>l) del(l++);while(q[id].r<r) del(r--);while(q[id].r>r) add(++r);ans[q[id].id]=su;}while(l<=r) del(l++);for(int i=1;i<=m;i++) printf("%d\n",ans[i]);for(int i=1;i<=n;i++) printf("%d ",sum[i]);return 0;
}

2019.1.10

转载于:https://www.cnblogs.com/butterflydew/p/10251667.html

洛谷 P2336 [SCOI2012]喵星球上的点名 解题报告相关推荐

  1. 洛谷 P2336 [SCOI2012]喵星球上的点名

    题目描述 a180285 幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有 N 个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M 个串来点名,每 ...

  2. 【BZOJ2754】[SCOI2012]喵星球上的点名

    [BZOJ2754][SCOI2012]喵星球上的点名 题面 bzoj 洛谷 题解 这题有各种神仙做法啊,什么暴力\(AC\)自动机.\(SAM\)等等五花八门 我这个蒟蒻在这里提供一种复杂度正确且常 ...

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

    二次联通门 : BZOJ 2754: [SCOI2012]喵星球上的点名 /*BZOJ 2754: [SCOI2012]喵星球上的点名此题有N种做法...见到众dalao用各种奇怪的姿势AC此题..具 ...

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

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 2246 Solved: 975 Description ...

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

    Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串来点 ...

  6. 【刷题】BZOJ 2754 [SCOI2012]喵星球上的点名

    Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串来点 ...

  7. [BZOJ2754]-[SCOI2012]喵星球上的点名-AC自动机+树状数组

    说在前面 感觉这题还是挺经典的 所以还是写了记录一下- 题目 BZOJ2754传送门 洛谷P2336传送门 看题可进传送门 题目-略长,概括起来有点麻烦 解法 读完这道题之后,可以发现实际上它就是要我 ...

  8. 2754. [SCOI2012]喵星球上的点名【后缀数组】

    Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣.   假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串 ...

  9. [BZOJ2754][SCOI2012]喵星球上的点名(后缀数组+莫队)

    Address 洛谷P2336 BZOJ2754 LOJ#2374 Solution 考虑在每个人的姓和名之间插入一个无关的字符. 这样问题就转化成了一些主串和一些模式串,询问每个模式串能匹配到多少个 ...

最新文章

  1. 排序算法四:归并排序
  2. gradle的基本设置
  3. 阿里云服务器 宝塔面板 配置Python项目
  4. 软件缺陷的优先级和严重性定义
  5. 运行launch文件报错Roslaunch got a ‘No such file or directory‘ error while attempting to run:
  6. JVM实战与原理---Class文件结构
  7. [改善Java代码]让工具类不可实例化
  8. 百度地图标点点击变色_《和平精英》版本爆料第三弹:雪地洞穴开启!组队标点功能升级~...
  9. 两次结果的绝对差值_你知道电子天平的检定和检定结果的影响因素有哪些吗?...
  10. SpringBoot实战(七):替代if的优雅方案,提高程序扩展性
  11. .sh 编译 java_build-java.sh
  12. Linux中的权限管理命令-chmod
  13. C++学习(四五七)查看dll的几种方式
  14. 【税务基础知识】--很实用的常识
  15. x64位游戏call代码测试注入器
  16. 解构华为AI技术布局:构建无所不及的智能
  17. php在线电子小说网站毕业设计源码
  18. signature=1be7575a614ba3597c2c53247a739d1c,18-02-07【摄影机系统】ARRI大画幅摄影机系统常见问题解答...
  19. byte[]转String出现乱码(EFBFBD或3F)
  20. java 阿里云服务器流下载慢的可能原因

热门文章

  1. 华为正式加入互联网路由安全规范 MANRS
  2. 求生之路2服务器ip直连,寝室无法通过ip直连,而且进入游戏后发现一些奇怪的地方……求帮助...
  3. 关于C语言的图像光标处理
  4. Linux桌面i3与i7,IT小干货 | i3.i5.i7.i9有什么区别?桌面篇
  5. polygon NFT开发教程
  6. make install clean的意思
  7. 我们做不到一刀劈死它,但可以先切断它的一根脚趾头
  8. 应用打开方式是计算机程序,电脑文件打开方式里不能选择程序 解决方案
  9. 深度学习 情感分析_使用深度学习进行情感分析
  10. 小屁孩的伤感空间日志_多谢伱的不珍惜让我学会死訫