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存儿子. 然后用名字串在自动机上跑,以为是名或姓的子串就行所以把名和姓中间加个特殊字符拼 ...
随机推荐
- ios高效开发二--ARC跟block那点事
block是可以捕捉上下文的特殊代码块. block可以访问定义在block外的变量,当在block中使用时,它就会为其在作用域内的每个标量变量创建一个副本. 如果通过self拥有一个block,然后 ...
- 51nod-独木舟问题
n个人,已知每个人体重,独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人.显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟?分析: 一个显然的策略 ...
- web前端对文件的引用规则
web前端一般常用文件 .html .css .js.但是当用css文件和html引入资源(比如图片)时,路径可能不相同.下面总结了几条. 使用相对路径引入规则: html或者js引入图片,按照htm ...
- 机房-动环-江森ODS系统
优势: 标准的BACnet系统平台 开放的集成特性 支持Desktop and Server平台 支持多达100个NxE 支持无线应用,可以手机访问 DCIM---数据中心基础架构管理平台介绍 不同于 ...
- plsql解决64位解决办法
plsql解决64位解决办法 设置PLSQL Developer访问本机64位Oracle 由于在本机Windows Server 2008 R2 X64上安装了64位的Oracle 11.2.0.1 ...
- codecombat之KithGard地牢19-37关代码分享
codecombat中国游戏网址:http://www.codecombat.cn/ 全部代码为javascript代码分享 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19 ...
- 【Java并发编程实战】—–synchronized
在我们的实际应用其中可能常常会遇到这样一个场景:多个线程读或者.写相同的数据,訪问相同的文件等等.对于这样的情况假设我们不加以控制,是非常easy导致错误的. 在java中,为了解决问题,引入临界区概 ...
- poj1286 Necklace of Beads【裸polya】
非常裸的polya,只是我看polya看了非常久 吉大ACM模板里面也有 #include <cstdio> #include <cmath> #include <ios ...
- Win+X
Win+X 方便的快捷键,可以快速使用命令行和运行!
- poj--1383--Labyrinth(树的直径)
Labyrinth Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 4062 Accepted: 1529 Descrip ...