题目大意:略

由于字符集大,要用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. 利用Tensorflow实现手写字符识别

    模式识别领域应用机器学习的场景非常多,手写识别就是其中一种,最简单的数字识别是一个多类分类问题,我们借这个多类分类问题来介绍一下google最新开源的tensorflow框架,后面深度学习的内容都会基 ...

  2. 【Educational Codeforces Round 48 (Rated for Div. 2) D】Vasya And The Matrix

    [链接] 我是链接,点我呀:) [题意] 告诉你每一行.每一列的异或和. 让你求出一个符合要求的原矩阵. [题解] 显然应该有 a1^a2^....^an = b1^b2^....^bn 也即两边同时 ...

  3. LinkedList 注意事项

      public E getFirst() 返回此列表的第一个元素. public E getLast() 返回此列表的最后一个元素. public E removeFirst() 移除并返回此列表的 ...

  4. rabbitMQ学习笔记(二) 简单的发送与接收消息 HelloWorld

    首先要下载rabbitmq的javaClient库,然后加入到项目中,下载地址为:http://www.rabbitmq.com/releases/rabbitmq-java-client/v3.1. ...

  5. [SQL]选取随机行

    在sql server中语句如下: select     top 10     * from recordTable order by NEWID();

  6. arp与免费arp的差别,arp老化

    免费arp:应用场景: case1:PC通过DHCP申请地址.在获取到IP地址后,会发送免费ARP,目的用于探測同一网段时候存在同样的IP地址终端,防止IP冲突. case2:PC的MAC地址发生变化 ...

  7. 路由器一键桥接Android实现

    開始之前,首先说一下什么叫一键桥接,所谓一键桥接,就是点击一下.就能够对所连接的路由器进行网络中继设置.以实现路由器能够通过已有的无线路由器进行网络訪问. 那么实现这个功能有几种方法呢?能够说有非常多 ...

  8. HDU-1042-N!(Java大法好 &amp;&amp; HDU大数水题)

    N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Subm ...

  9. Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明--转载(http://blog.csdn.net/tianlesoftware/article/details/7777511)

    一.RAC 全局等待事件说明 在RAC环境中,和全局调整缓存相关的最常见的等待事件是global cache cr request,global cache busy和equeue. 当一个进程访问需 ...

  10. input file上传文件

    如何使用input[type='file']来上传文件呢? html: //angular<input type="file" (change)="fileChan ...