【BZOJ 2754 喵星球上的点名】
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 2512 Solved: 1092
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
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 喵星球上的点名】的更多相关文章
- BZOJ 2754 喵星球上的点名(后缀数组)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2754 题意:给出n个字典串,m个询问串.输出每个询问串出现在多少个字典串中.最后输出每个 ...
- 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]喵星球上的点名 [AC自动机+map+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1902 Solved: 837[Submit][St ...
- BZOJ 2754 SCOI 2012 喵星球上的点名 后缀数组 树状数组
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2068 Solved: 907[Submit][St ...
- BZOJ 2754 【SCOI2012】 喵星球上的点名
题目链接:喵星球上的点名 首先可以发现姓和名两个串就是逗你玩的.在两个串中间插入一个\(10001\),当成一个串做就可以了. 于是我们的问题转化为了: 有\(n\)个串\(A_1,A_2,\dots ...
- BZOJ_2754__[SCOI2012]_喵星球上的点名_(暴力+后缀数组)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2754 给出n个姓名串和m个点名串.求每个点名串在多少人的姓名中出现过(在名中出现或在姓中出现, ...
- BZOJ2754: [SCOI2012]喵星球上的点名
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 680 Solved: 314[Submit][Sta ...
- 【BZOJ2754】喵星球上的点名(AC自动机)
[BZOJ2754]喵星球上的点名(AC自动机) 题面 BZOJ 题解 友情提示:此题请不要在cogs上提交,它的数据有毒 对于点名串构建\(AC\)自动机 然后把名字丢进去进行匹配, 大力统计一下答 ...
随机推荐
- 3星|《科技投资新时代》:TMT行业资讯汇编
科技投资新时代:TMT投资方法.趋势与热点聚焦 全书共6章,前4章是一些投资与分析的基本方法与技巧,第5章集中讲通信行业的现状与趋势,第6章讲大数据.物联网.全面屏等TMT行业热点. 总体来说数据.信 ...
- Bellman-ford 模板
#include<bits/stdc++.h> const int inf=0x3f3f3f3f; ; struct edge{ int u,v;//两个点 int w; //权值 Edg ...
- Zabbix自动发现之fping
原文发表于cu:2016-06-21 Zabbix自动发现功能从配置流程上比较简单:Discovery与Action. 在做Zabbix的自动发现验证时,使用"ICMP ping" ...
- Matlab中 .' 的作用。
Syntax B = A.' B = transpose(A) Description B = A.' returns the nonconjugate transpose of A, that ...
- Thunder团队第七周 - Scrum会议4
Scrum会议4 小组名称:Thunder 项目名称:i阅app Scrum Master:翟宇豪 工作照片: 宋雨在照相,所以不在相片中. 参会成员: 王航:http://www.cnblogs.c ...
- 【Alpha】阶段第二次Scrum Meeting
[Alpha]阶段第二次Scrum Meeting 工作情况 团队成员 今日已完成任务 明日待完成任务 刘峻辰 发表评论接口 更新评论接口 赵智源 部署实际项目 编写脚本实现持续集成 肖萌威 编写注册 ...
- GIT团队实战
项目要求 组长博客 遇到的困难及解决办法 组员1(组长):王彬 遇到的困难 在团队任务分工的时候没有充分照顾到所有人,导致队员们的工作量不均. 现场编程时间不够 解决办法 在此对组员们表示抱歉,由于 ...
- Java微笔记(8)
Java 中的包装类 Java 为每个基本数据类型都提供了一个包装类,这样就可以像操作对象那样来操作基本数据类型 基本类型和包装类之间的对应关系: 包装类主要提供了两大类方法: 将本类型和其他基本类型 ...
- IDEA + SSH OA 第一天(IDEA 文件夹类型了解)
回顾一下 IDEA 的文件夹的类型 设置文件夹方法 或者点击右上角的 文件夹的类型选择:可通过,右键文件夹,选择你要的类型: Sources Root : 源码的目录 Resources Root:源 ...
- C++ Primer Plus学习:第十章
过程性编程和面向对象编程 面向对象编程(OOP)的特性: 抽象 封装和数据隐藏 多态 继承 代码的可重用性 抽象和类 类是一种将抽象转化为用户定义类型的C++工具,它将数据表示和操纵数据的方法合成一个 ...