Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 2512  Solved: 1092
[Submit][Status][Discuss]

Description

a180285幸运地被选做了地球到喵星球的留学生。他发现喵星人在上课前的点名现象非常有趣。   假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成。喵星球上的老师会选择M个串来点名,每次读出一个串的时候,如果这个串是一个喵星人的姓或名的子串,那么这个喵星人就必须答到。 然而,由于喵星人的字码过于古怪,以至于不能用ASCII码来表示。为了方便描述,a180285决定用数串来表示喵星人的名字。
现在你能帮助a180285统计每次点名的时候有多少喵星人答到,以及M次点名结束后每个喵星人答到多少次吗? 

Input

 
现在定义喵星球上的字符串给定方法:
先给出一个正整数L,表示字符串的长度,接下来L个整数表示字符串的每个字符。
输入的第一行是两个整数N和M。
接下来有N行,每行包含第i 个喵星人的姓和名两个串。姓和名都是标准的喵星球上的
字符串。
接下来有M行,每行包含一个喵星球上的字符串,表示老师点名的串。

Output

 
对于每个老师点名的串输出有多少个喵星人应该答到。
然后在最后一行输出每个喵星人被点到多少次。

Sample Input

2 3

6 8 25 0 24 14 8 6 18 0 10 20 24 0

7 14 17 8 7 0 17 0 5 8 25 0 24 0

4 8 25 0 24

4 7 0 17 0

4 17 0 8 25

Sample Output

2

1

0

1 2

【提示】

事实上样例给出的数据如果翻译成地球上的语言可以这样来看

2 3

izayoi sakuya

orihara izaya

izay

hara

raiz

HINT

【数据范围】

对于30%的数据,保证:

1<=N,M<=1000,喵星人的名字总长不超过4000,点名串的总长不超过2000。

对于100%的数据,保证:

1<=N<=20000,1<=M<=50000,喵星人的名字总长和点名串的总长分别不超过100000,保证喵星人的字符串中作为字符存在的数不超过10000。

Source

【题解】

          ①我只会后缀数组(AC自动机不熟,后面补上

          ②很无脑地做:把所有东西连在一起(加上不同!连接符!),记下bl[i](i位置属于第几个点姓名串)和st[i]第i个点名串的开头位置,枚举串,在sa里往前后找,并统计答案;

          ③很朴素的去重:记下vis,找到一次就标记;

          ④数据水了吧

 /*2 3
6 8 25 0 24 14 8 6 18 0 10 20 24 0
7 14 17 8 7 0 17 0 5 8 25 0 24 0
4 8 25 0 24
4 7 0 17 0
4 17 0 8 25
喵星人的输出好萌啊~~ Presentation_Error
后缀数组 后缀数组 后缀数组 后缀数组 后缀数组 后缀数组 后缀数组 后缀数组
*/
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <ctime>
#include <cmath>
#define inf 0x3f3f3f3f
#define ll long long
#define N 500100
#define Maxs 10001
#define mem(f,a) memset(f,a,sizeof(f))
#define Run(i,l,r) for(int i=l;i<=r;i++)
#define Don(i,l,r) for(int i=l;i>=r;i--)
#define Eun(i,u,E,head) for(int i=head[u],v=E[i].v;i!=-1;i=E[i].next,v=E[i].v)
using namespace std;
int n,m;
int s[N],x[N],y[N],c[N],sa[N],Ht[N],Rk[N];
int vis[N],bl[N],st[N],len[N];
int ans1[N],ans2[N];
void Build_sa(int n,int m)
{ Run(i,,m) c[i]=;
Run(i,,n-) c[x[i]=s[i]]++;
Run(i,,m) c[i]+=c[i-];
Don(i,n-,) sa[--c[x[i]]]=i;
int p;
for (int k=;k<=n;k<=){
p=; Run(i,n-k,n-) y[p++]=i;
Run(i,,n-) if (sa[i]>=k) y[p++]=sa[i]-k;
Run(i,,m) c[i]=;
Run(i,,n-) c[x[y[i]]]++;
Run(i,,m) c[i]+=c[i-];
Don(i,n-,) sa[--c[x[y[i]]]]=y[i];
p=; swap(x,y);
x[sa[]]=;
Run(i,,n-){
x[sa[i]]=(y[sa[i]]==y[sa[i-]]&&y[sa[i]+k]==y[sa[i-]+k])? p-: p++;
}
if (p==n) break;
m=p;
}
}
void Build_Ht(int n)
{ Run(i,,n-) Rk[sa[i]]=i;
int k=;
Run(i,,n-){
if (k) k--;
int j=sa[Rk[i]-];
while (s[i+k]==s[j+k]) k++;
Ht[Rk[i]]=k;
}
}
int main()
{ freopen("name.in","r",stdin);
freopen("name.out","w",stdout);
scanf("%d%d",&n,&m);
int tot=;
Run(i,,n){
int num;
scanf("%d",&num);
Run(j,,num) scanf("%d",&s[tot]),s[tot]++,bl[tot++]=i;
scanf("%d",&num);
s[tot++]=Maxs+;
Run(j,,num) scanf("%d",&s[tot]),s[tot]++,bl[tot++]=i;
s[tot++]=Maxs+;
}
Run(i,,m){
int num;
scanf("%d",&num);
st[i]=tot;len[i]=num;
Run(j,,num) scanf("%d",&s[tot]),s[tot++]++;
s[tot++]=Maxs+;
}
s[tot++]=;
Build_sa(tot,Maxs+);
Build_Ht(tot);
Run(i,,m){
int p,q;
p=q=Rk[st[i]];
while (Ht[p]>=len[i]){
int x=bl[sa[--p]];
if (!x) continue;
if (vis[x]!=i) ans1[i]++,ans2[x]++,vis[x]=i;
}
while (Ht[q+]>=len[i]){
int x=bl[sa[++q]];
if (!x) continue;
if (vis[x]!=i) ans1[i]++,ans2[x]++,vis[x]=i;
}
}
Run(i,,m) printf("%d\n",ans1[i]);
Run(i,,n) printf("%d ",ans2[i]);
return ;
}//by tkys_Austin;

【BZOJ 2754 喵星球上的点名】的更多相关文章

  1. BZOJ 2754 喵星球上的点名(后缀数组)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2754 题意:给出n个字典串,m个询问串.输出每个询问串出现在多少个字典串中.最后输出每个 ...

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

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

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

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

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

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

  5. BZOJ 2754 SCOI 2012 喵星球上的点名 后缀数组 树状数组

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

  6. BZOJ 2754 【SCOI2012】 喵星球上的点名

    题目链接:喵星球上的点名 首先可以发现姓和名两个串就是逗你玩的.在两个串中间插入一个\(10001\),当成一个串做就可以了. 于是我们的问题转化为了: 有\(n\)个串\(A_1,A_2,\dots ...

  7. BZOJ_2754__[SCOI2012]_喵星球上的点名_(暴力+后缀数组)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2754 给出n个姓名串和m个点名串.求每个点名串在多少人的姓名中出现过(在名中出现或在姓中出现, ...

  8. BZOJ2754: [SCOI2012]喵星球上的点名

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

  9. 【BZOJ2754】喵星球上的点名(AC自动机)

    [BZOJ2754]喵星球上的点名(AC自动机) 题面 BZOJ 题解 友情提示:此题请不要在cogs上提交,它的数据有毒 对于点名串构建\(AC\)自动机 然后把名字丢进去进行匹配, 大力统计一下答 ...

随机推荐

  1. linux菜鸟笔记

    linux目录的子目录复制 cp -r 要复制的目录+新的目录 cp -r a test 意思就是将a的子目录及文件复制到新的目录test下面 zt@ubuntu:~/Desktop$ mkdir - ...

  2. html查漏补缺之meta标签

    什么是meta标签? meta标签是html标记head区的一个关键标签,它位于HTML文档的<head>和<title>之间(有些也不是在<head>和<t ...

  3. 三、Django之请求与响应-Part 1

    一.新建项目 进入你指定的项目保存目录,然后运行下面的命令: $ django-admin startproject mysite 这将在目录下生成一个mysite目录,也就是你的这个Django项目 ...

  4. Towards Accurate Multi-person Pose Estimation in the Wild 论文阅读

    论文概况 论文名:Towards Accurate Multi-person Pose Estimation in the Wild 作者(第一作者)及单位:George Papandreou, 谷歌 ...

  5. Eclipse用java.util.Scanner时出现Resource leak: 'in' is never closed

    Resource leak: 'in' is never closed : 直译为资源泄漏,‘in’一直没被关闭. 由于声明了数据输入扫描仪(Scanner in),从而获得了配置内存,但是结束时却没 ...

  6. hdfs遍历文件方法

    import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org. ...

  7. 技本功丨收藏!斜杠青年与你共探微信小程序云开发(下篇)

    2019年2月26日,人们为了一个杯子疯了一天. 星巴克猫爪杯,一场已经与猫无关了的“圣杯战争“.网上的倒卖价格,已炒至近千元! 求而不得,舍而不能,得而不惜.这是人最大的悲哀... 所以,请珍惜以下 ...

  8. 【视频编解码·学习笔记】4. H.264的码流封装格式 & 提取NAL有效数据

    一.码流封装格式简单介绍: H.264的语法元素进行编码后,生成的输出数据都封装为NAL Unit进行传递,多个NAL Unit的数据组合在一起形成总的输出码流.对于不同的应用场景,NAL规定了一种通 ...

  9. HDU 5666 Segment 数论+大数

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5666 bc(中文):http://bestcoder.hdu.edu.cn/contests ...

  10. 第八章 Mysql运算符

    算术运算符 符号 表达式形式 作用 + x1+x2 加法 - x1-x2 减法 * x1*x2 乘法 / x1/x2 除法 div x1 div x2 同上 % x1%x2 取余 mod mod(x1 ...