题目大意:略

由于字符集大,要用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树)的更多相关文章

  1. BZOJ 2754: [SCOI2012]喵星球上的点名 [AC自动机+map+暴力]

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1902  Solved: 837[Submit][St ...

  2. BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机、树状数组)

    吐槽: 为啥很多人用AC自动机暴力跳都过了?复杂度真的对么? 做法一: AC自动机+树状数组 姓名的问题,中间加个特殊字符连起来即可. 肯定是对点名串建AC自动机(map存儿子),然后第一问就相当于问 ...

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

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 649  Solved: 305[Submit][Sta ...

  4. BZOJ 2754: [SCOI2012]喵星球上的点名 [后缀数组+暴力]

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1906  Solved: 839[Submit][St ...

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

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

  6. BZOJ2754: [SCOI2012]喵星球上的点名(AC自动机)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2816  Solved: 1246[Submit][Status][Discuss] Descript ...

  7. BZOJ2754: [SCOI2012]喵星球上的点名(AC自动机/后缀自动机)

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

  8. bzoj 2754 [SCOI2012]喵星球上的点名(后缀数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2754 [题意] 每只喵有名姓,如果被老师点到名或姓的子串都要答道,但每只喵一次点名只答 ...

  9. bzoj 2754: [SCOI2012]喵星球上的点名【AC自动机】

    洛谷90,最后一个点死活卡不过去(也可能是我写的有问题? 比较暴力的做法,把询问带着标号建立AC自动机,用map存儿子. 然后用名字串在自动机上跑,以为是名或姓的子串就行所以把名和姓中间加个特殊字符拼 ...

随机推荐

  1. Project Euler 19 Counting Sundays( 蔡勒公式计算星期数 )

    题意:在二十世纪(1901年1月1日到2000年12月31日)中,有多少个月的1号是星期天? 蔡勒公式:计算 ( year , month , day ) 是星期几 以下图片仅供学习! /****** ...

  2. HDU 5901 Count primes( Meisell-Lehmer算法模板 )

    链接:传送门 题意:计算 [ 1 , n ] 之间素数的个数,(1 <= n <= 1e11) 思路:Meisell-Lehmer算法是计算超大范围内素数个数的一种算法,原理并不明白,由于 ...

  3. C++ STL - queue使用详解

    c++队列模板类的定义在<queue>头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型. 下面详细介绍 ...

  4. linux 遇到(vsftpd)—500 OOPS:chroot

    今天在用vsftpd 时出现一个问题: 500 OOPS:chroot 解决办法: 1.关闭SELINUX [root@localhost ~]#vi /etc/sysconfig/selinux # ...

  5. 0112centos上面l安装卸载mysq

    http://www.centoscn.com/CentosServer/sql/2015/0409/5127.html常用命令cat /etc/issuerpm -qa | grep mysqlyu ...

  6. [SharePoint][SharePoint Designer 入门经典]Chapter11 工作流基础

    1.SPS中可以创建的工作流的种类 2.SPD工作流基础 3.创建列表\库工作流 4.创建可重用的工作流 5.利用基于站点的工作流 6.SPD 工作流的限制和注意事项

  7. spring boot系列--spring security (基于数据库)登录和权限控制

    先说一下AuthConfig.java Spring Security的主要配置文件之一 AuthConfig 1 @Configuration 2 @EnableWebSecurity 3 publ ...

  8. Linux 技巧:让进程在后台可靠执行的几种方法

    我们常常会碰到这种问题.用 telnet/ssh 登录了远程的 Linux server,执行了一些耗时较长的任务, 结果却因为网络的不稳定导致任务中途失败.怎样让命令提交后不受本地关闭终端窗体/网络 ...

  9. Android 中View的绘制机制源代码分析 二

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/46842891 本篇文章接着上篇文章的内容来继续讨论View的绘制机制,上篇文章中我们主要解说 ...

  10. BZOJ 2124: 等差子序列 线段树维护hash

    2124: 等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一 ...