bzoj 2754 [SCOI2012]喵星球上的点名 后缀数组+莫队
先把所有串按顺序放到一起,两个串间加非法字符隔开,求一个后缀数组。
然后对于询问,满足条件的子串在后缀数组上一定是连续一段区间。
这个区间的左右端点可以在读入的过程中二分求。
然后这个问题变成了多组询问求一段区间内不同的数的个数。
莫队裸题。
慢着,每个元素的出现次数怎么求呀?
莫队时维护,设共有cnt个询问,那么第i个询问时一个元素的出现状态的改变会影响到cnt-i+1个询问中该元素的出现状态。因此答案累加相应次数就行了。
#include <bits/stdc++.h>
using namespace std;
#define N 210000
#define A 11000
int n,m,len,cnt,sz;
int a[N],bel[N],sa[N],has[N],tr[N],rank[N],ans[N];
int num[N],sum,a1[N];
int cmp(int x,int y,int k)
{if(x+k>len||y+k>len)return 0;return rank[x]==rank[y]&&rank[x+k]==rank[y+k];
}
void getsa()
{int i,cnt;for(i=1;i<=len;i++)has[a[i]]++;for(i=0,cnt=0;i<=A;i++)if(has[i])tr[i]=++cnt;for(i=1;i<=A;i++)has[i]+=has[i-1];for(i=1;i<=len;i++)rank[i]=tr[a[i]],sa[has[a[i]]--]=i;for(int k=1;cnt!=len;k<<=1){for(i=1;i<=len;i++)has[i]=0;for(i=1;i<=len;i++)has[rank[i]]++;for(i=1;i<=len;i++)has[i]+=has[i-1];for(i=len;i>=1;i--)if(sa[i]>k)tr[sa[i]-k]=has[rank[sa[i]-k]]--;for(i=1;i<=k;i++)tr[len-i+1]=has[rank[len-i+1]]--;for(i=1;i<=len;i++)sa[tr[i]]=i;for(i=1,cnt=0;i<=len;i++)tr[sa[i]]=cmp(sa[i],sa[i-1],k) ? cnt:++cnt;for(i=1;i<=len;i++)rank[i]=tr[i];}
}
struct node
{int l,r,pos;node(){}node(int l,int r,int pos):l(l),r(r),pos(pos){}friend bool operator < (const node &r1,const node &r2){if(r1.l/sz==r2.l/sz)return r1.r<r2.r;return r1.l/sz<r2.l/sz;};
}p[N];
void insert(int x,int tp,int now)
{int t=bel[sa[x]];num[t]+=tp;if(tp==1&&num[t]==1)sum++,a1[t]+=(cnt-now+1);if(tp==-1&&num[t]==0)sum--,a1[t]-=(cnt-now+1);
}
int main()
{//freopen("tt.in","r",stdin);scanf("%d%d",&n,&m);for(int i=1,l;i<=n;i++)for(int j=0;j<=1;j++){scanf("%d",&l);for(int k=1;k<=l;k++)scanf("%d",&a[++len]),bel[len]=i;a[++len]=A;}sz=sqrt(len)+1;getsa();for(int n1,now=1;now<=m;now++){scanf("%d",&n1);int ln=1,rn=len;for(int i=1,x;i<=n1;i++){scanf("%d",&x);int l=ln,r=rn,lt;while(l<=r){int mid=(l+r)>>1;if(a[sa[mid]+i-1]<x)l=mid+1;else r=mid-1;}lt=l;l=ln,r=rn;while(l<=r){int mid=(l+r)>>1;if(a[sa[mid]+i-1]<=x)l=mid+1;else r=mid-1;}rn=r;ln=lt;}if(ln<=rn)p[++cnt]=node(ln,rn,now);}sort(p+1,p+1+cnt);for(int i=1,l=1,r=0;i<=cnt;i++){while(l<p[i].l)insert(l,-1,i),l++;while(l>p[i].l)l--,insert(l,1,i);while(r<p[i].r)r++,insert(r,1,i);while(r>p[i].r)insert(r,-1,i),r--;ans[p[i].pos]=sum;}for(int i=1;i<=m;i++)printf("%d\n",ans[i]);for(int i=1;i<=n;i++)printf("%d%c",a1[i],i==n ? '\n':' ');return 0;
}
bzoj 2754 [SCOI2012]喵星球上的点名 后缀数组+莫队相关推荐
- [SCOI2012]喵星球上的点名(后缀数组+莫队+ST表)
传送门 这题是真的秀.一眼看下去感觉AC自动机很可做,第一个问比较好处理,dfs序即可搞定,可第二问有点抽象,目前对树形结构的知识点不足以支持我解决这个问题.所以舍弃AC自动机,用SA做. SA做法: ...
- BZOJ 2754: [SCOI2012]喵星球上的点名
二次联通门 : BZOJ 2754: [SCOI2012]喵星球上的点名 /*BZOJ 2754: [SCOI2012]喵星球上的点名此题有N种做法...见到众dalao用各种奇怪的姿势AC此题..具 ...
- 【刷题】BZOJ 2754 [SCOI2012]喵星球上的点名
Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串来点 ...
- BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机、树状数组)
吐槽: 为啥很多人用AC自动机暴力跳都过了?复杂度真的对么? 做法一: AC自动机+树状数组 姓名的问题,中间加个特殊字符连起来即可. 肯定是对点名串建AC自动机(map存儿子),然后第一问就相当于问 ...
- [BZOJ2754][SCOI2012]喵星球上的点名 后缀数组
不科学啊...这题暴力可过...感觉所有串都是a就可以卡掉啊... 我的做法就是先把姓名串和询问串全部连在一起,并打上分隔符,并记录每个字符属于哪个串,求出SA.对于每个询问就从它所在的位置左右扫he ...
- 2754. [SCOI2012]喵星球上的点名【后缀数组】
Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串 ...
- SCOI2012 喵星球上的点名 BZOJ 2754
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 2246 Solved: 975 Description ...
- 【BZOJ2754】[SCOI2012]喵星球上的点名
[BZOJ2754][SCOI2012]喵星球上的点名 题面 bzoj 洛谷 题解 这题有各种神仙做法啊,什么暴力\(AC\)自动机.\(SAM\)等等五花八门 我这个蒟蒻在这里提供一种复杂度正确且常 ...
- 洛谷 P2336 [SCOI2012]喵星球上的点名 解题报告
P2336 [SCOI2012]喵星球上的点名 题目描述 a180285 幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有 \(N\) 个喵星人,每个喵星人的 ...
最新文章
- sqlmap使用_sqlmap从入门到精通第四章47使用EW代理导出和导入MSSQL数据
- iOS 用自签名证书实现 HTTPS 请求的原理实例讲解
- python散点图拟合曲线-python 拟合曲线并求参
- @总结 - 6@ 后缀自动机
- codeforces 954C
- 网络上各台计算机语言,人类使用语言来交流,同样,网络上的各台计算机之间也用某种语言交换信息,这样的语言通常指()。...
- helm安装postgres_Helm 入门介绍 Kubernetes 上的包管理软件
- python代码_抢球鞋?预测股市走势?淘宝秒杀?Python表示要啥有啥 - 街角的守望。...
- Python函数的参数
- 【开发工具】makefile之override的作用
- frame中src怎么设置成一个变量_webpack中Css的处理
- 正则除了几个汉字的其它汉字_理解汉字的几个层次
- vue2.x使用jsoneditor编辑器
- autocad二次开发资料总结
- 《灌篮高手》——一部看了n遍的动漫
- 庄子心得09:大道与自然
- 计算机房电磁辐射防护,机房防辐射处理解决方案
- Android热更新方案Robust——美团热更新(热修复)使用介绍
- 计算机保研QA——by chx
- Python破解加密的zip文件