离散化一下然后把姓名串和询问串都放一起做SA

bzoj3277串类似地,满足某一询问的后缀(就是和这个询问对应的后缀的LCP>=这个询问长度的后缀)的排名也是一个区间,把这个区间二分出来即可

现在要做的两个问题就变成了:

给定一些区间、一些点,每个点有对应的颜色(就是sa[i]对应的那个姓名串对应的人),问

1.每个区间中不同颜色的数量:同HH的项链

2.每个颜色被不同区间覆盖的数量:

  想法其实和1是类似的,扫到区间左端点的时候给a[i]++,扫到右端点的时候给a[对应左端点]--,然后每个点贡献的区间数就是pre[i]-pre[i的颜色上次出现位置],因为相当于我们每次算的是左端点在上次出现位置与现在位置之间的、右端点在现在位置之后的区间,是不重不漏的

(千万不要写出s[++j]=data[j]=rd();这种代码然后因为某些特性在某些地方A某些地方wa然后跑到讨论区去丢人)

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define ll long long
using namespace std;
const int maxn=4e5+,maxm=5e4+,maxq=1e5+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Node{
int l,r,i;
}que[maxq];
int NN,N,M,Q;
int data[maxn],s[maxn],bel[maxn];
int sa[maxn],rank[maxn],hei[maxn],rank1[maxn],tmp[maxn],cnt[maxn];
int st[maxn][],pos[maxq][];
int tr[maxn],L[maxn],lst[maxn],ans[maxq]; inline int lowbit(int x){return x&(-x);}
inline void add(int x,int y){
for(;x<=N;x+=lowbit(x)) tr[x]+=y;
}
inline int query(int x){
int re=;for(;x>;x-=lowbit(x)) re+=tr[x];return re;
} inline void getsa(){
int i,j=,k;
for(i=;i<=N;i++) cnt[s[i]]=;
for(i=;i<=M;i++) cnt[i]+=cnt[i-];
for(i=N;i;i--) rank[i]=cnt[s[i]]; for(k=;j!=N;k<<=){
memset(cnt,,sizeof(cnt));
for(i=;i<=N;i++) cnt[rank[i+k>N?:i+k]]++;
for(i=;i<=M;i++) cnt[i]+=cnt[i-];
for(i=N;i;i--) tmp[cnt[rank[i+k>N?:i+k]]--]=i;
memset(cnt,,sizeof(cnt));
for(i=;i<=N;i++) cnt[rank[i]]++;
for(i=;i<=M;i++) cnt[i]+=cnt[i-];
for(i=N;i;i--) sa[cnt[rank[tmp[i]]]--]=tmp[i];
memcpy(rank1,rank,sizeof(rank1));
rank[sa[]]=j=;
for(i=;i<=N;i++){
if(rank1[sa[i]]!=rank1[sa[i-]]||rank1[sa[i]+k>N?:sa[i]+k]!=rank1[sa[i-]+k>N?:sa[i-]+k]) j++;
rank[sa[i]]=j;
}M=j;
}
for(i=;i<=N;i++) sa[rank[i]]=i;
} inline void geth(){
for(int i=,j=;i<=N;i++){
if(rank[i]==) continue;
if(j) j--;
int x=sa[rank[i]-];
while(x+j<=N&&i+j<=N&&s[x+j]==s[i+j]) j++;
hei[rank[i]]=j;
}
} inline void getst(){
for(int i=N;i;i--){
st[i][]=hei[i];
for(int j=;st[i+(<<(j-))][j-];j++){
st[i][j]=min(st[i][j-],st[i+(<<(j-))][j-]);
}
}
} inline int rmq(int l,int r){
int x=log2(r-l+);
return min(st[l][x],st[r-(<<x)+][x]);
} inline void getq(int id,int p,int x){
int l0,r0,l,r;
if(hei[p+]<x) r0=p;
else{
l=p+,r=N;
while(l<=r){
int m=l+r>>;
if(rmq(p+,m)>=x) r0=m,l=m+;
else r=m-;
}
}
if(hei[p]<x) l0=p;
else{
l=,r=p;
while(l<=r){
int m=l+r>>;
if(rmq(m,p)>=x) l0=m-,r=m-;
else l=m+;
}
}
que[id].l=l0,que[id].r=r0,que[id].i=id;
} inline bool cmp(Node a,Node b){
return a.r<b.r;
} inline void solve(){
int i,j,k;
for(i=;i<=Q;i++){
getq(i,rank[pos[i][]],pos[i][]-pos[i][]+);
L[i]=que[i].l;
}sort(que+,que+Q+,cmp);
sort(L+,L+Q+); for(i=,j=;i<=N&&j<=Q;i++){
int x=bel[sa[i]];
if(x){
if(lst[x]) add(lst[x],-);
add(i,);lst[x]=i;
}
for(;que[j].r==i&&j<=Q;j++){
ans[que[j].i]=query(que[j].r)-query(que[j].l-);
}
}
for(i=;i<=Q;i++) printf("%d\n",ans[i]);
memset(ans,,sizeof(ans));
memset(lst,,sizeof(lst));
memset(tr,,sizeof(tr));
for(i=,j=,k=;i<=N;i++){
for(;j<=Q&&L[j]==i;j++) add(i,);
ans[bel[sa[i]]]+=query(i)-query(lst[bel[sa[i]]]);
lst[bel[sa[i]]]=i;
for(;k<=Q&&que[k].r==i;k++) add(que[k].l,-);
}for(i=;i<=NN;i++) printf("%d ",ans[i]);
} int main(){
//freopen("2336.in","r",stdin);
int i,j,k;
NN=N=rd(),Q=rd();
for(i=,j=;i<=N*+Q;i++){
int a=rd();
if(i>N*) pos[i-N*][]=j+,pos[i-N*][]=j+a;
for(k=;k<a;k++){
s[j]=data[++j]=rd();
if(i<=N*) bel[j]=(i+)/;
}
s[j]=data[++j]=-;
}N=j;
sort(data+,data+N+);
M=unique(data+,data+N+)-data-;
for(i=;i<=N;i++) s[i]=lower_bound(data+,data+M+,s[i])-data-;
M+=;
getsa();geth();getst();
solve();
return ;
}

luogu2336 喵星球上的点名 (SA+二分答案+树状数组)的更多相关文章

  1. BZOJ2754 [SCOI2012]喵星球上的点名 SA+莫队+树状数组

    题面 戳这里 题解 首先先把所有给出的姓名和询问全部接在一起,建出\(height\)数组. 某个串要包含整个询问串,其实就相当于某个串与询问串的\(lcp\)为询问串的长度. 而两个后缀\(Suff ...

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

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

  3. [CSP-S模拟测试]:序列(二分答案+树状数组)

    题目传送门(内部题98) 输入格式 第一行一个整数$n$,第二行$n$个整数$a_1\sim a_n$,第三行$n$个整数$b_1\sim b_n$. 输出格式 一行一个整数表示$\max(r-l+1 ...

  4. cf1073D Berland Fair (二分答案+树状数组)

    用一个树状数组维护前缀和,每次我二分地找一个位置,使得我能一路买过去 但这个买不了 那以后肯定也都买不了了,就把它改成0,再从头二分地找下一个位置,直到这一圈我可以跑下来 然后就看跑这一圈要花多少钱. ...

  5. AtCoder Regular Contest 101 (ARC101) D - Median of Medians 二分答案 树状数组

    原文链接https://www.cnblogs.com/zhouzhendong/p/ARC101D.html 题目传送门 - ARC101D 题意 给定一个序列 A . 定义一个序列 A 的中位数为 ...

  6. 【序列莫队+二分答案+树状数组】POJ2104-K-th Number

    [题目大意] 给出一个长度为n的序列和m组查询(i,j,k),输出[i,j]中的第k大数. [思路] 先离散化然后莫队分块.用树状数组来维护当前每个值的个数,然后对于每次询问二分答案即可. 又一次实力 ...

  7. 4418: [Shoi2013]扇形面积并|二分答案|树状数组

    为何感觉SHOI的题好水. ..又是一道SB题 从左到右枚举每个区间,遇到一个扇形的左区间就+1.遇到右区间就-1,然后再树状数组上2分答案,还是不会码log的.. SHOI2013似乎另一道题发牌也 ...

  8. Luogu2336 SCOI2012 喵星球上的点名 SA、莫队

    传送门 一道很套路的题目 先将所有串拼在一起,两个不同的串之间放一个没有出现在任何串中的字符做分隔,然后SA 那么对于所有点名串能够点到的名字串在SA中对应一段区间 把这些区间拿出来然后莫队统计每一个 ...

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

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

随机推荐

  1. Spring学习日志之纯Java配置的MVC框架搭建

    依赖引入 <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifa ...

  2. 为小米(红米)6A解锁_ROOT_安装天下游虚拟定位教程_已亲身验证通过!附图

    第一步骤: 把TeamViewer发给客户 第二步骤: 在自己电脑上购买小米账号:http://shop1.91kami.com/UXWHTEY9KN?cid=1200 要求:(购买邮箱注册账号,需要 ...

  3. MFS+Keepalived双机高可用热备方案操作记录

    基于MFS的单点及手动备份的缺陷,考虑将其与Keepalived相结合以提高可用性.在Centos下MooseFS(MFS)分布式存储共享环境部署记录这篇文档部署环境的基础上,只需要做如下改动: 1) ...

  4. css3 动画效果实现

    前沿 在工作中,经常有一些需要切换的交互样式.如果直接在两种状态之间切换,就显得有点生硬.加上一些动画效果就会好很多. 示例1:点击的三角切换 实现过程 第一步实现这个三角形 用的svg 的多边形画法 ...

  5. PAT甲级题解(慢慢刷中)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6102219.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  6. HTTP 及相关知识

    什么是HTTP.流程? 什么是AJAX.方法.状态码?

  7. 龟速机器学习总结----day1

    机器学习主要工作大致分为以下几步,数据预处理,包括数据切分,特征选取,数据缺失值处理,来了解数据.接下来分割数据,分别分出训练集和测试集.第三步,选择模型,使用训练数据训练模型参数,再对测试数据进行预 ...

  8. Scrum Meeting day 4

                第四次会议 No_00:工作情况 No_01:任务说明 待完成 已完成 No_10:燃尽图 No_11:照片记录 待更新 No_100:代码/文档签入记录 No_101:出席表 ...

  9. 如何实现基于ssh框架的投票系统的的质量属性

    如何实现基于ssh框架的投票系统的的质量属性: 项目 :网上考试系统 我做的是网上考试系统,因为标准化的考试越来越重要,而通过计算机进行标准化判卷,系统会自动判卷出成绩,组织考试的人不用组织人员打印试 ...

  10. 第三个Sprint冲刺第6天

    成员:罗凯旋.罗林杰.吴伟锋.黎文衷