BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机+map维护Trie树)
题目大意:略
由于字符集大,要用map维护Trie树
并不能用AC自动机的Trie图优化,不然内存会炸
所以我用AC自动机暴跳fail水过的
显然根据喵星人建AC自动机是不行的,所以要根据问题建
然而这题有一些很艮的地方:
1.如果一个喵的名和姓都被点到,那他只被点到了一次
2.询问的串可能相同
3.如果map中并不包含某个元素,但你强行用数组表示它,那么它会返回0,然后这个元素会被强行插入map并赋值成0
#include <map>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define ui unsigned int
#define inf 0x3f3f3f3f
#define N 100010
#define imap map<int,int>::iterator
using namespace std;
//re
int n,m;
int a[N],len[N],l[N],r[N],qans[N],use[N],b[N];
int gint()
{
int rett=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){rett=(rett<<)+(rett<<)+c-'';c=getchar();}
return rett*fh;
}
struct Trie
{
map<int,int>ch[N];
vector<int>ed[N];
int val[N],fail[N],ans[N],tot;
void build_trie(int j)
{
int x=;
for(int i=;i<=len[j];i++){
imap k=ch[x].find(a[i]);
if(k==ch[x].end())
ch[x][a[i]]=++tot,val[tot]=a[i],x=tot;
else x=(*k).second;
if(i==len[j]) ed[x].push_back(j);
}
}
void Build()
{
for(int i=;i<=m;i++){
len[i]=gint();
for(int j=;j<=len[i];j++)
a[j]=gint();
build_trie(i);
}
}
void Fail()
{
queue<int>q;
int x=,i,j,y,z;
for(imap k=ch[].begin();k!=ch[].end();k++)
q.push((*k).second);
while(!q.empty())
{
x=q.front();q.pop();
for(imap k=ch[x].begin();k!=ch[x].end();k++)
{
i=(*k).first;
j=(*k).second;
y=fail[x];
while(!ch[y][i]&&y)
y=fail[y];
fail[j]=ch[y][i];
q.push(j);
}
}
}
void query(int p)
{
int x=;
queue<int>q;
for(int i=l[p];i<=r[p];i++)
{
while(!ch[x][b[i]]&&x)
x=fail[x];
x=ch[x][b[i]];
for(int j=x;j;j=fail[j])
if(ed[j].size()>&&!use[j]){
for(int k=;k<ed[j].size();k++)
ans[ed[j][k]]++,qans[p]++;
use[j]=,q.push(j);
}
}
x=;
for(int i=l[p+];i<=r[p+];i++)
{
while(!ch[x][b[i]]&&x)
x=fail[x];
x=ch[x][b[i]];
for(int j=x;j;j=fail[j])
if(ed[j].size()>&&!use[j]){
for(int k=;k<ed[j].size();k++)
ans[ed[j][k]]++,qans[p]++;
use[j]=,q.push(j);
}
}
while(!q.empty())
{int x=q.front();q.pop();use[x]=;}
}
}t; int main()
{
//freopen("name1.in","r",stdin);
scanf("%d%d",&n,&m);
int cnt=;
for(int i=;i<=n*;i++){
l[i]=cnt;
int num=gint();
r[i]=l[i]+num-;
for(int j=l[i];j<=r[i];j++)
b[j]=gint();
cnt=r[i]+;
}
t.Build();
t.Fail();
for(int i=;i<=n*;i+=)
t.query(i);
for(int i=;i<=m;i++)
printf("%d\n",t.ans[i]);
for(int i=;i<=n*;i+=)
printf("%d ",qans[i]);
puts("");
return ;
}
BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机+map维护Trie树)的更多相关文章
- BZOJ 2754: [SCOI2012]喵星球上的点名 [AC自动机+map+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1902 Solved: 837[Submit][St ...
- BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机、树状数组)
吐槽: 为啥很多人用AC自动机暴力跳都过了?复杂度真的对么? 做法一: AC自动机+树状数组 姓名的问题,中间加个特殊字符连起来即可. 肯定是对点名串建AC自动机(map存儿子),然后第一问就相当于问 ...
- BZOJ 2754: [SCOI2012]喵星球上的点名
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 649 Solved: 305[Submit][Sta ...
- BZOJ 2754: [SCOI2012]喵星球上的点名 [后缀数组+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1906 Solved: 839[Submit][St ...
- 【刷题】BZOJ 2754 [SCOI2012]喵星球上的点名
Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串来点 ...
- 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]喵星球上的点名(后缀数组)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2754 [题意] 每只喵有名姓,如果被老师点到名或姓的子串都要答道,但每只喵一次点名只答 ...
- bzoj 2754: [SCOI2012]喵星球上的点名【AC自动机】
洛谷90,最后一个点死活卡不过去(也可能是我写的有问题? 比较暴力的做法,把询问带着标号建立AC自动机,用map存儿子. 然后用名字串在自动机上跑,以为是名或姓的子串就行所以把名和姓中间加个特殊字符拼 ...
随机推荐
- 为什么在JavaScript中0.1+0.2不等于0.3?
0.1+0.2不等于0.3?是不是有点颠覆你的认知,但是,在js中,是真实存在的! console.log(0.1+0.2); // 0.30000000000000004 其实这都是因为浮点数运算的 ...
- django模板使用
概述 模板由两部分组成,HTML代码,逻辑控制代码,作用:快速生成HTML页面,优点:模板的设计实现了业务逻辑与现实内容的分离 定义模板 挖坑与继承 模板继承可以减少页面的内容的重复定义,实现页面的重 ...
- 谷歌翻译使用php curl请求接口文档
支持语言 阿拉伯语代码 ar 英语代码 en 中文(简体)代码 zh-CN php中curl类常用方法封装和详解 REST API Method translate POST /language/tr ...
- java 递归实现删除或查询指定目录下的全部文件
/** * 递归列举盘符下的全部文件的名称,如E:\HeartIsland * * @author HeartIsland * */ public class FileListDemo { /** * ...
- SDUT OJ 1124 飞越原野 (三维BFS练习)
飞跃原野 nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit5000ms Memory Limit 65536K ...
- HDU 2874 LCA离线算法 tarjan算法
给出N个点,M条边.Q次询问 Q次询问每两点之间的最短距离 典型LCA 问题 Marjan算法解 #include "stdio.h" #include "strin ...
- 使用Handler在子线程中更新UI
Android规定仅仅能在主线程中更新UI.假设在子线程中更新UI 的话会提演示样例如以下错误:Only the original thread that created a view hierach ...
- java 用JNA调用dll 参考文档
1 Java调用C语言动态库(JNA方式):回调函数.结构体数组传参.结构体数组返回 2jna结构体数组 JNA结构体数组 3JNA调用C语言动态链接库学习实践总结 4 Java 通过 JNA 调 ...
- 【BZOJ 2038】小Z的袜子
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2038 [算法] 莫队算法 [代码] #include<bits/stdc++. ...
- 利用CSS3中的clac()实现按照屏幕分辨率自适应宽度
1.简介 calc()看其外表像个函数.平时在制作页面的时候,总会碰到有的元素是100%的宽度(例如body元素).如果元素宽度为100%时,其自身不带其他盒模型属性设置还好,要是有别的,那将导致盒子 ...