【BZOJ2754】【codevs2403】喵星球上的点名,AC自动机与STL的狂欢
Time:2016.05.17
Author:xiaoyimi
转载注明出处谢谢
传送门1
传送门2
思路:
(本来想在学习AC自动机的时候做这个题的,但发现要用vector,所以就弃了)
由于我们要求点名串是名字的子串,所以我们以点名串为模式串,建立AC自动机,并建立结尾节点与原串编号的映射,用名字进行匹配时沿fail往上寻找,如果之前没找到过就把这个节点所保存的结尾节点的大小siz都加上,也就是说当前名字可以在这个节点匹配上siz个点名串,同时这siz个点名串也可以对应这个名字,所以还要开一个数组记录自动机上每个结尾节点能匹配上的名字的数量
(可能说的有点拗口,读者老爷可以自己思考一下,或者看代码了解细节等等)
注意:
感谢Yveh的提醒让我走出误区
一开始纠结是名字还是点名串建自动机,听Yveh一说猛然想到自己以名字建自动机的方法是错误的
还有就是忘记了fail指针的神奇性质,最初的想法是从自动机每个节点的子树上寻找答案,悲伤的故事:-(
代码:
#include"bits/stdc++.h"
#define M 1000006
#define LL long long
using namespace std;
int n,m,root=1,cnt=1;
int fail[M],len[2][M/5],vis[M],sum[M],ans[M],hash[M>>1];//vis表示自动机上的节点处理询问时的访问情况,sum存储自动机节点上名字经过该节点的总次数,hash[i]表示第i个点名串在AC自动机上对应的结尾节点
map<int,int>trie[M];
vector<int> name[2][M/5],son[M],ID[M];
int in()
{int t=0;char ch=getchar();while (!isdigit(ch)) ch=getchar();while (isdigit(ch)) t=(t<<1)+(t<<3)+ch-48,ch=getchar();return t;
}
void insert(int len,int id)
{int x,now=root;for (int i=0;i<len;i++){x=in();if (!trie[now][x])trie[now][x]=++cnt,son[now].push_back(x);now=trie[now][x];}ID[now].push_back(id);hash[id]=now;
}
void build()
{queue<int>q;q.push(root);while(!q.empty()){int k=q.front();q.pop();for (int i=0;i<son[k].size();i++){int tmp=fail[k],x=trie[k][son[k][i]];while (tmp&&!trie[tmp][son[k][i]]) tmp=fail[tmp];if (k!=root&&tmp) fail[x]=trie[tmp][son[k][i]];else fail[x]=root;q.push(x);}}
}
main()
{n=in();m=in();for (int i=1;i<=n;i++)for (int j=0;j<2;j++){len[j][i]=in();for (int k=1;k<=len[j][i];k++)name[j][i].push_back(in());}for (int i=1;i<=m;i++)insert(in(),i);build();for (int i=1;i<=n;i++)for (int j=0;j<2;j++){int now=root,tmp;for (int k=0;k<len[j][i];k++){while (now&&!trie[now][name[j][i][k]]) now=fail[now];if (!now) now=root;else now=trie[now][name[j][i][k]];tmp=now;for (;tmp!=root;tmp=fail[tmp])if (ID[tmp].size()&&vis[tmp]!=i)vis[tmp]=i,ans[i]+=ID[tmp].size(),sum[tmp]++;}}for (int i=1;i<=m;i++) printf("%d\n",sum[hash[i]]);for (int i=1;i<n;i++) printf("%d ",ans[i]);printf("%d",ans[n]);
}
【BZOJ2754】【codevs2403】喵星球上的点名,AC自动机与STL的狂欢相关推荐
- BZOJ2754: [SCOI2012]喵星球上的点名(AC自动机/后缀自动机)
Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串 ...
- [BZOJ2754]-[SCOI2012]喵星球上的点名-AC自动机+树状数组
说在前面 感觉这题还是挺经典的 所以还是写了记录一下- 题目 BZOJ2754传送门 洛谷P2336传送门 看题可进传送门 题目-略长,概括起来有点麻烦 解法 读完这道题之后,可以发现实际上它就是要我 ...
- BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机、树状数组)
吐槽: 为啥很多人用AC自动机暴力跳都过了?复杂度真的对么? 做法一: AC自动机+树状数组 姓名的问题,中间加个特殊字符连起来即可. 肯定是对点名串建AC自动机(map存儿子),然后第一问就相当于问 ...
- bzoj2754JZOJ2834【SCOI2012】喵星球上的点名 AC自动机+STL
题意比较复杂,就不说了. 感觉这题目拿来恶心人的..连输入都要花费好大功夫.表示这种题目经典套路啊,一般来说直接上AC自动机,暴力把大串往小串上贴,然后直接计算答案就行了,但是这数据大小简直了..算了 ...
- bzoj2754: [SCOI2012]喵星球上的点名
传送门 事实证明,我肉眼debug了两个晚上,还是不及对拍效率高. AC自动机写错了都毫不自觉的智障宸 因为数据水,写的暴力 //Achen #include<algorithm> #in ...
- [BZOJ2754][SCOI2012]喵星球上的点名(后缀数组+莫队)
Address 洛谷P2336 BZOJ2754 LOJ#2374 Solution 考虑在每个人的姓和名之间插入一个无关的字符. 这样问题就转化成了一些主串和一些模式串,询问每个模式串能匹配到多少个 ...
- [BZOJ2754][SCOI2012]喵星球上的点名 后缀数组
不科学啊...这题暴力可过...感觉所有串都是a就可以卡掉啊... 我的做法就是先把姓名串和询问串全部连在一起,并打上分隔符,并记录每个字符属于哪个串,求出SA.对于每个询问就从它所在的位置左右扫he ...
- 洛谷2336 BZOJ2754 SCOI2012 喵星球上的点名 SA 莫队 二分
题目链接 题意: 有nnn个人,每个人有两个串,一个表示姓,一个表示名,这里用数字表示字符.有mmm次询问,对于每次询问,你要回答有多少个人的姓或者名至少有一个是给出的串的子串.最后再对于这nnn个人 ...
- 【BZOJ2754】【SCOI2012】喵星球上的点名(后缀数组)
Description click me Solution 据说AC自动机可做?反正我使用后缀数组做的.. 把所有的串连在一起,用一个很大的数分割开来. 求出后缀数组,暴力地在height上找可以匹配 ...
- 【BZOJ2754】[SCOI2012]喵星球上的点名
[BZOJ2754][SCOI2012]喵星球上的点名 题面 bzoj 洛谷 题解 这题有各种神仙做法啊,什么暴力\(AC\)自动机.\(SAM\)等等五花八门 我这个蒟蒻在这里提供一种复杂度正确且常 ...
最新文章
- CreateStructuringElementEx
- CPLEX在Linux上的安装与配置
- 【javascript基础】由demo来进阶学习闭包等概念
- pytorch tensorboard
- 安卓性能调优工具简介(转)
- fastreport 中 给数值形数据做 格式 保留小数位数以0补足
- 配置jvm堆最大内存eden区与s0或者s1区域比例
- AHOI2005航线规划 bzoj1969(LCT缩点)
- ASP.NET Core托管运行Quartz.NET作业调度详解
- ldconfig mysql_ldconfig命令介绍
- python mean dropna_小丸子踏入python之路:python_day05(用Pandas处理泰坦尼克船员获救数据titanic_train.csv)...
- 【EMNLP2020】Cross-Thought句子表示预训练
- 认识影片版本(CAM、TS、TC、DVD、HD、BD、TVRIP等)
- 华为16道经典面试题
- 瑞星客户端卸载操作手册
- VSCode: Acquiring CodeLLDB platform package 速度慢
- Linux 下 TC 命令原理及详解
- Android SDK 国内镜像
- 20个计算机英语关键词,英语微课堂:20个专业体育英语术语,秒懂赛场关键词!...
- Process Scrum
热门文章
- 补习系列(17)-springboot mongodb 内嵌数据库
- ubuntu更改mysql编码格式_Ubuntu修改mysql编码格式
- spikingjelly的20201221版本跑通ANN2SNN
- MacOS12+SublimeText+Skim无法正常跳转Skim的问题与解决
- ajax上传图片并显示,Ajax实现图片上传并预览
- vb.net中滚动条一直显示没有数据时也显示_前端学习中你必须了解的几张图
- 计算机无法启动windows无线服务,win10无线服务无法启动怎么解决
- 交通仿真软件测试自学,[2018年最新整理]各类交通仿真软件综合介绍.docx
- java cygwin,cygwin和java
- java后端站内通知_正确使用Java事件通知