【BZOJ2754】喵星球上的点名(AC自动机)
【BZOJ2754】喵星球上的点名(AC自动机)
题面
题解
友情提示:此题请不要在cogs上提交,它的数据有毒
对于点名串构建\(AC\)自动机
然后把名字丢进去进行匹配,
大力统计一下答案即可
当然,要用\(map\)记录\(trie\)树
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 52000
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
void ReadStr(vector<int> &a)
{
int x=read();
a.resize(x+1);
a[0]=x;
for(int i=1;i<=x;++i)a[i]=read();
}
vector<int> nam[MAX],fam[MAX];
vector<int> sub[MAX];
map<int,int>::iterator it;
int n,m;
struct Node
{
map<int,int> son;
int ff,fl;
set<int> lst;
}t[MAX<<2];
int tot,vis[MAX],ans1[MAX],ans2[MAX];
void insert(vector<int> a,int g)
{
int now=0;
for(int i=1;i<=a[0];++i)
{
if(!t[now].son[a[i]])
t[now].son[a[i]]=++tot;
now=t[now].son[a[i]];
}
t[now].lst.insert(g);
t[now].fl=1;
}
void BuildFail()
{
queue<int> Q;
for(it=t[0].son.begin();it!=t[0].son.end();++it)Q.push(it->second);
while(!Q.empty())
{
int u=Q.front();Q.pop();
if(!t[u].son.size())continue;
for(it=t[u].son.begin();it!=t[u].son.end();++it)
{
int v=it->second,c=it->first,p=t[u].ff;
while(p&&!t[p].son[c])p=t[p].ff;
if(t[p].son[c])t[v].ff=t[p].son[c];
Q.push(v);
t[v].fl|=t[t[v].ff].fl;
}
}
}
void Work(vector<int> a,int str)
{
int now=0;
for(int i=1;i<=a[0];++i)
{
int c=a[i];
if(t[now].son[c])now=t[now].son[c];
else
{
while(now&&!t[now].son[c])now=t[now].ff;
if(t[now].son[c])now=t[now].son[c];
}
if(t[now].fl)
{
int p=now;
while(p)
{
for(set<int>::iterator it=t[p].lst.begin();it!=t[p].lst.end();++it)
if(vis[*it]!=str){ans1[*it]++;ans2[str]++;vis[*it]=str;}
p=t[p].ff;
}
}
}
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;++i)
{
ReadStr(nam[i]);
ReadStr(fam[i]);
}
for(int i=1;i<=m;++i)ReadStr(sub[i]);
for(int i=1;i<=m;++i)insert(sub[i],i);
BuildFail();
for(int str=1;str<=n;++str)
{
Work(nam[str],str);
Work(fam[str],str);
}
for(int i=1;i<=m;++i)printf("%d\n",ans1[i]);
for(int i=1;i<=n;++i){printf("%d",ans2[i]);(i==n)?putchar('\n'):putchar(' ');}
return 0;
}
【BZOJ2754】喵星球上的点名(AC自动机)的更多相关文章
- BZOJ 2754: [SCOI2012]喵星球上的点名 [AC自动机+map+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1902 Solved: 837[Submit][St ...
- BZOJ2754: [SCOI2012]喵星球上的点名(AC自动机)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2816 Solved: 1246[Submit][Status][Discuss] Descript ...
- BZOJ2754: [SCOI2012]喵星球上的点名(AC自动机/后缀自动机)
Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串 ...
- BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机、树状数组)
吐槽: 为啥很多人用AC自动机暴力跳都过了?复杂度真的对么? 做法一: AC自动机+树状数组 姓名的问题,中间加个特殊字符连起来即可. 肯定是对点名串建AC自动机(map存儿子),然后第一问就相当于问 ...
- BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机+map维护Trie树)
题目大意:略 由于字符集大,要用map维护Trie树 并不能用AC自动机的Trie图优化,不然内存会炸 所以我用AC自动机暴跳fail水过的 显然根据喵星人建AC自动机是不行的,所以要根据问题建 然而 ...
- 【BZOJ2754】[SCOI2012]喵星球上的点名
[BZOJ2754][SCOI2012]喵星球上的点名 题面 bzoj 洛谷 题解 这题有各种神仙做法啊,什么暴力\(AC\)自动机.\(SAM\)等等五花八门 我这个蒟蒻在这里提供一种复杂度正确且常 ...
- P2336 [SCOI2012]喵星球上的点名(后缀自动机+莫队+dfs序)
P2336 [SCOI2012]喵星球上的点名 名字怎么存?显然是后缀自动机辣 询问点到多少个喵喵喵其实就是 查询后缀自动机上parent树的一个子树 于是我们考虑莫队 怎么树上莫队呢 我们用dfs序 ...
- 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: 649 Solved: 305[Submit][Sta ...
随机推荐
- Angular+ionic2+Echarts 实现图形制作,以饼图为例
step1:添加插件echart; npm install echarts --save package.json文件中会在dependencies中添加echarts,如下图: step2:运行cm ...
- 基于Java的WebSocket推送
WebSocket的主动推送 关于消息推送,现在的解决方案如轮询.长连接或者短连接,当然还有其他的一些技术框架,有的是客户端直接去服务端拿数据. 其实推送推送主要讲的是一个推的概念,WebSocket ...
- block,inline,inline-block的区别
最近正在复习,紧张地准备几天后的笔试,然后刚好看到这个地方. block:块级元素,会换行,如div,p,h1~h6,table这些,可以设置宽高: inline:行内元素,不换行,挤在一行显示 ...
- 在一台电脑上运行两个或两个以上的tomcat
前言 在开发过程中,我们可能会同时用到多个tomcat,但以正常安装的形式安装多个tomcat,无论启动哪一个tomcat,打开的都是配置了环境变量的那一个tomcat,所以进行一些设置,以达到我们同 ...
- python自动化--语言基础1--数据类型及类型转换
Python中核心的数据类型有哪些?变量(数字.字符串.元组.列表.字典) 什么是数据的不可变性?哪些数据类型具有不可变性数据的不可变是指数据不可更改,比如: a = ("abc" ...
- 如何让div水平居中呢?
一百度div居中,多数都是一个答案,但是有时候这种方法并不是万能的...不废话,将我知道的方法都列举一下好了,随时更新. 1.设置width值,指定margin-left和margin-right为a ...
- 《android开发进阶从小工到专家》读书笔记--网络框架的设计与实现
第一步: 第一层:Request--请求类型,JSON,字符串,文件 第二层:消息队列--维护了提交给网络框架的请求列表,并且根据响应的规则进行排序.默认情况下按照优先级和进入队列的顺序来执行,该队列 ...
- MyCat 读写分离,负载均衡
docker mysql 主从复制 配合Spring 事务 注意事项 配置好JRE,安装好MYCAT 在mysql主库创建表,会同步到从库 CREATE TABLE `user` ( `id` ) N ...
- webTest-----webUI自动化框架
webTest框架介绍 地址 https://github.com/wuranxu/webTest 希望大家能够喜欢!!! 简介 本框架基于Python3+selenium3+unittest组成,用 ...
- struts2标签库----数据标签详解
上篇文章我们介绍struts2标签库中的控制标签的基本使用和部分原理,本篇文章接着了解下标签库中有关数据标签的使用和原理.主要涉及以下数据标签: action标签:用于在视图页面跳转到一个Action ...