2754. [SCOI2012]喵星球上的点名【后缀数组】
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
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。
emmmm终于调试过了,这个题比Sandy的卡片还要麻烦一点
首先将所有串(姓名、点名)连接起来,染色(姓、名颜色不同,0无颜色)
然后在每个点名串后额外加一个0,这样包含点名串的串就可以排名在点名串后了
从每个点名串往后扫,若当前扫到的串的前缀:
1、颜色相同
2、该串代表的人的姓、名都未被点过
3、该串不为分隔0
4、该串为姓名串而不是点名串
则统计答案,并给这个人的答案加一下
luogu的数据加强后就过不去了QvQ
#include<iostream>
#include<cstring>
#include<cstdio>
#define MAXN (1000000+10)
using namespace std;
int n,m=,N,M,maxn,cnt,name_len;
int r[MAXN],a[MAXN],Color[MAXN],Ans[MAXN],Ask_len[MAXN];
int SA[MAXN],Rank[MAXN],Height[MAXN];
int wt[MAXN],wa[MAXN],wb[MAXN],Name[MAXN];
int stack[MAXN],top;
int used[MAXN]; bool cmp(int *y,int a,int b,int k)
{
int arank1=y[a];
int brank1=y[b];
int arank2=a+k>=n?-:y[a+k];
int brank2=b+k>=n?-:y[b+k];
return arank1==brank1 && arank2==brank2;
} void Init()
{
scanf("%d%d",&N,&M);
for (int i=;i<=N;++i)
{
scanf("%d",&cnt);
for (int j=;j<=cnt;++j)
{
Color[n]=(i-)*+;
scanf("%d",&r[n++]);r[n-]++;
}
scanf("%d",&cnt);
for (int j=;j<=cnt;++j)
{
Color[n]=(i-)*+;
scanf("%d",&r[n++]);r[n-]++;
}
}
name_len=n;
for (int i=;i<=M;++i)
{
scanf("%d",&cnt);
Ask_len[n]=cnt;
for (int j=;j<=cnt;++j)
{
Color[n]=name_len+(i-)*+;
scanf("%d",&r[n++]);r[n-]++;
}
r[n++]=;
}
} void Build_SA()
{
int *x=wa,*y=wb;
for (int i=;i<m;++i) wt[i]=;
for (int i=;i<n;++i) wt[x[i]=r[i]]++;
for (int i=;i<m;++i) wt[i]+=wt[i-];
for (int i=n-;i>=;--i) SA[--wt[x[i]]]=i; for (int j=;j<=n;j<<=)
{
int p=;
for (int i=n-j;i<n;++i) y[p++]=i;
for (int i=;i<n;++i) if (SA[i]>=j) y[p++]=SA[i]-j; for (int i=;i<m;++i) wt[i]=;
for (int i=;i<n;++i) wt[x[y[i]]]++;
for (int i=;i<m;++i) wt[i]+=wt[i-];
for (int i=n-;i>=;--i) SA[--wt[x[y[i]]]]=y[i]; m=;swap(x,y);
x[SA[]]=;
for (int i=;i<n;++i)
x[SA[i]]=cmp(y,SA[i],SA[i-],j)?m-:m++;
if (m>=n) break;
}
} void Build_Height()
{
for (int i=;i<n;++i) Rank[SA[i]]=i;
int k=;
Height[]=;
for (int i=;i<n;++i)
{
if (!Rank[i]) continue;
if (k) k--;
int j=SA[Rank[i]-];
while (r[i+k]==r[j+k]) k++;
Height[Rank[i]]=k;
}
} int Solve(int x)
{
int p=x,len=Ask_len[SA[x]],sum=;
while (Height[++p]>=len)
if (Color[SA[p]]==Color[SA[p]+len-] && used[Color[SA[p]]%==?Color[SA[p]]-:Color[SA[p]]]!=x && Color[SA[p]] && Color[SA[p]]<=*N)
{
used[Color[SA[p]]%==?Color[SA[p]]-:Color[SA[p]]]=x;
Ans[Color[SA[p]]]++;
sum++;
}
return sum;
} int main()
{
Init();
Build_SA();
Build_Height();
for (int i=;i<n;++i)
if (Ask_len[i])
printf("%d\n",Solve(Rank[i]));
int cnt=,flag=;
for (int i=;i<=*N;++i)
{
cnt+=Ans[i];
if (i%==)
{
if (!flag)
printf("%d",cnt),flag=;
else
printf(" %d",cnt);
cnt=;
}
}
}
2754. [SCOI2012]喵星球上的点名【后缀数组】的更多相关文章
- BZOJ 2754: [SCOI2012]喵星球上的点名 [后缀数组+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1906 Solved: 839[Submit][St ...
- BZOJ 2754 SCOI 2012 喵星球上的点名 后缀数组 树状数组
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2068 Solved: 907[Submit][St ...
- BZOJ 2754: [SCOI2012]喵星球上的点名
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 649 Solved: 305[Submit][Sta ...
- BZOJ 2754: [SCOI2012]喵星球上的点名 [AC自动机+map+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1902 Solved: 837[Submit][St ...
- 【刷题】BZOJ 2754 [SCOI2012]喵星球上的点名
Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串来点 ...
- bzoj 2754 [SCOI2012]喵星球上的点名(后缀数组)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2754 [题意] 每只喵有名姓,如果被老师点到名或姓的子串都要答道,但每只喵一次点名只答 ...
- BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机、树状数组)
吐槽: 为啥很多人用AC自动机暴力跳都过了?复杂度真的对么? 做法一: AC自动机+树状数组 姓名的问题,中间加个特殊字符连起来即可. 肯定是对点名串建AC自动机(map存儿子),然后第一问就相当于问 ...
- BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机+map维护Trie树)
题目大意:略 由于字符集大,要用map维护Trie树 并不能用AC自动机的Trie图优化,不然内存会炸 所以我用AC自动机暴跳fail水过的 显然根据喵星人建AC自动机是不行的,所以要根据问题建 然而 ...
- bzoj 2754: [SCOI2012]喵星球上的点名【AC自动机】
洛谷90,最后一个点死活卡不过去(也可能是我写的有问题? 比较暴力的做法,把询问带着标号建立AC自动机,用map存儿子. 然后用名字串在自动机上跑,以为是名或姓的子串就行所以把名和姓中间加个特殊字符拼 ...
随机推荐
- css3 animation(动画)笔记
在开始介绍Animation之前我们有必要先来了解一个特殊的东西,那就是"Keyframes",我们把他叫做“关键帧”,玩过flash的朋友可能对这个东西并不会陌生.下面我们就一起 ...
- 利用SignalR来同步更新Winfrom小试
之前写了个用Socket来更新多个Winfrom的试例,这两天看了下SignalR,也用这个来试一下 SignalR 地址:https://www.asp.net/signalr 我这个也是基于 ht ...
- VisualVM监控远程阿里云主机
一.前言 使用VisualVM监控远程主机,主要是要在远程主机上部署JMX服务和jstat服务,jstat服务的部署花了我半天的时间,而且,网上的资基本都是缺胳膊少腿的,没有一篇是一个整体(行得通的) ...
- HDU 3501 Calculation 2------欧拉函数变形
Calculation 2 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- sys模块 常用函数
sys模块是和python解释器打交道的 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) s ...
- Review——JS的异步与同步
一.概念 同步(synchronous):指在js的主线程上,所有任务被依次执行: 异步(asynchronous):指任务不进入主线程,进入任务队列(task):当“任务队列”通知主线程,异步任务才 ...
- CentOS 7 搭建PXC 数据库集群
CentOS 7 搭建PXC 数据库集群 PXC( Percona XtraDB Cluster ) 特点如下: 1.同步复制,事务要么在所有节点提交或不提交,保证了数据的强一致性. 2.多主复制,可 ...
- IOS下 input 被软键盘方案遮盖问题解决
前言: 并没有完美解决 ! 场景: 最近在做企业微信H5的一个项目,里面有个动态列表页,开始输入框是隐藏的,点击评论才会出现并让 input 聚焦.经过测试在安卓上面应该没什么问题,但是iOS上面会出 ...
- wdcpV3面板安装ssl证书 apache教程 子站SSL配置
本帖最后由 q1082121 于 2016-11-24 12:31 编辑 方案二 apache1.把apache类型的ssl三个文件上传到:/www/wdlinux//www/wdlinux/http ...
- Oracle EBS 有效银行账户取值
SELECT ba.bank_account_id, --银行账户key ftv.territory_short_name, --国家 ftv.territory_code, --国家简称 cb.ba ...