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. 英特尔® 实感™ 摄像头 (F200) 应用如何实现最佳用户体验

    英特尔开发人员专区原文 由于视频不能直接嵌入, 请点击视频标题观看.谢谢. 英特尔® 实感™ 技术支持我们重新定义如何与计算设备交互,包括允许用户通过手势自然交互. 为了帮助大家了解使用英特尔® 实感 ...

  2. Windows单机配置Kafka环境

    首先确保机器已经安装好Zookeeper,Zookeeper安装参考 Windows单机配置Zookeeper环境 然后确保Zookeeper是正常启动状态 下载Kafka http://kafka. ...

  3. 洛谷【P1052】过河

    https://www.luogu.org/problemnew/show/P1052 题目描述 在河上有一座长度为 L 的独木桥, 一只青蛙想沿着独木桥从河的一侧跳到另一侧. 在桥上有一些石子, 青 ...

  4. 33.[LeetCode] Search in Rotated Sorted Array

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  5. windows64系统下安装 redis服务 (详细)

    Linux下Redis安装链接 :     转到 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表) ...

  6. spring mvc 详细配置

    转自: http://www.cnblogs.com/superjt/p/3309255.html 现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是 ...

  7. Scrum立会报告+燃尽图(十一月二十四日总第三十二次):视频剪辑

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...

  8. 互评Alpha版本——可以低头,但没必要——取件帮

    基于NABCD评论作品,及改进建议: 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 随着电商平台的发展,越来越多的人选择网购,但是东师的一部分快递网点不在校内,需要走很长的一 ...

  9. 基于spec评论作品 - 探路者 贪吃蛇

    基于spec评论作品,试用(并截图)所有其他小组的Alpha作品,与软件功能说明书对比,评论Alpha作品对软件功能说明书的实现. 首先通过命令行进入到游戏主页面中. 因为软件没有编译为exe程序,所 ...

  10. UVALive 6913 I Want That Cake 博弈+dp

    题目链接: http://acm.hust.edu.cn/vjudge/problem/96343 I Want That Cake Time Limit: 3000MS 64bit IO Forma ...