先把所有串按顺序放到一起,两个串间加非法字符隔开,求一个后缀数组。

然后对于询问,满足条件的子串在后缀数组上一定是连续一段区间。
这个区间的左右端点可以在读入的过程中二分求。

然后这个问题变成了多组询问求一段区间内不同的数的个数。
莫队裸题。
慢着,每个元素的出现次数怎么求呀?
莫队时维护,设共有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]喵星球上的点名 后缀数组+莫队相关推荐

  1. [SCOI2012]喵星球上的点名(后缀数组+莫队+ST表)

    传送门 这题是真的秀.一眼看下去感觉AC自动机很可做,第一个问比较好处理,dfs序即可搞定,可第二问有点抽象,目前对树形结构的知识点不足以支持我解决这个问题.所以舍弃AC自动机,用SA做. SA做法: ...

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

    二次联通门 : BZOJ 2754: [SCOI2012]喵星球上的点名 /*BZOJ 2754: [SCOI2012]喵星球上的点名此题有N种做法...见到众dalao用各种奇怪的姿势AC此题..具 ...

  3. 【刷题】BZOJ 2754 [SCOI2012]喵星球上的点名

    Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串来点 ...

  4. BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机、树状数组)

    吐槽: 为啥很多人用AC自动机暴力跳都过了?复杂度真的对么? 做法一: AC自动机+树状数组 姓名的问题,中间加个特殊字符连起来即可. 肯定是对点名串建AC自动机(map存儿子),然后第一问就相当于问 ...

  5. [BZOJ2754][SCOI2012]喵星球上的点名 后缀数组

    不科学啊...这题暴力可过...感觉所有串都是a就可以卡掉啊... 我的做法就是先把姓名串和询问串全部连在一起,并打上分隔符,并记录每个字符属于哪个串,求出SA.对于每个询问就从它所在的位置左右扫he ...

  6. 2754. [SCOI2012]喵星球上的点名【后缀数组】

    Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣.   假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串 ...

  7. SCOI2012 喵星球上的点名 BZOJ 2754

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 2246 Solved: 975 Description ...

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

    [BZOJ2754][SCOI2012]喵星球上的点名 题面 bzoj 洛谷 题解 这题有各种神仙做法啊,什么暴力\(AC\)自动机.\(SAM\)等等五花八门 我这个蒟蒻在这里提供一种复杂度正确且常 ...

  9. 洛谷 P2336 [SCOI2012]喵星球上的点名 解题报告

    P2336 [SCOI2012]喵星球上的点名 题目描述 a180285 幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有 \(N\) 个喵星人,每个喵星人的 ...

最新文章

  1. sqlmap使用_sqlmap从入门到精通第四章47使用EW代理导出和导入MSSQL数据
  2. iOS 用自签名证书实现 HTTPS 请求的原理实例讲解
  3. python散点图拟合曲线-python 拟合曲线并求参
  4. @总结 - 6@ 后缀自动机
  5. codeforces 954C
  6. 网络上各台计算机语言,人类使用语言来交流,同样,网络上的各台计算机之间也用某种语言交换信息,这样的语言通常指()。...
  7. helm安装postgres_Helm 入门介绍 Kubernetes 上的包管理软件
  8. python代码_抢球鞋?预测股市走势?淘宝秒杀?Python表示要啥有啥 - 街角的守望。...
  9. Python函数的参数
  10. 【开发工具】makefile之override的作用
  11. frame中src怎么设置成一个变量_webpack中Css的处理
  12. 正则除了几个汉字的其它汉字_理解汉字的几个层次
  13. vue2.x使用jsoneditor编辑器
  14. autocad二次开发资料总结
  15. 《灌篮高手》——一部看了n遍的动漫
  16. 庄子心得09:大道与自然
  17. 计算机房电磁辐射防护,机房防辐射处理解决方案
  18. Android热更新方案Robust——美团热更新(热修复)使用介绍
  19. 计算机保研QA——by chx
  20. Python破解加密的zip文件

热门文章

  1. 以Python角度学习Javascript(一)
  2. hana 查看表字段_SAP HANA 表格
  3. PMP项目管理“人际关系与团队技能”归纳总结
  4. 人机交互设备(HID)
  5. SparseArray与ArrayMap
  6. 【BIOS】主板BIOS的两种启动模式,传统模式(Legacy)和UEFI模式
  7. 公司起名工具,有了它你就是半仙了
  8. 反反爬虫 大众点评-图片文字破解 2020年6月6日更新
  9. 忘记win7,xp系统的开机密码
  10. Android studio 之 高级调试技巧,看这一篇够啦