洛咕 P2336 [SCOI2012]喵星球上的点名
洛咕 P2336 [SCOI2012]喵星球上的点名
先求出SA和height,一个点名串对应的就是一段区间,还有很多个点,就转化成了
有很多个区间,很多个点集,对每个区间计算和多少个点集有交,对每个点集计算和多少个区间有交。
第一个,HH的项链的树状数组做法
第二个,因为是点集所以要去重,假设点集有\(a_1,a_2,\cdots,a_k\),可以对每个区间只再覆盖的第一个点做记录
就是记录\(\sum_{i=1}^k\sum_{\texttt{interval }[l,r]}\left[l\in[a_{i-1}+1,a_i],r\geq a_i\right]\)
#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
std::vector<int>A[100010],B[100010],C[100010],S,P;
int len,x[400010],y[400010],t[400010],SA[400010],rk[400010];
int ht[400010];
il bool cmp(int a,int b,int k){return y[a]==y[b]&&y[a+k]==y[b+k];}
int ans1[100010],ans2[100010];
int lg[400010],st[19][400010];
il int query(int l,int r){
int g=lg[r-l+1];
return std::min(st[g][l],st[g][r-(1<<g)+1]);
}
std::vector<int>ins[400010],del[400010],p_del[400010];
int Tree[400010],Tree2[400010],lst[400010],LL[400010],RR[400010];
il vd update(int*t,int p,int x){while(p<=len)t[p]+=x,p+=p&-p;}
il int query(int*t,int r){int ret=0;while(r)ret+=t[r],r-=r&-r;return ret;}
int main(){
int n=gi(),m=gi();
for(int i=1;i<=n;++i){
len=gi();
while(len--)A[i].push_back(gi()+200000);
len=gi();
while(len--)B[i].push_back(gi()+200000);
}
for(int i=1;i<=m;++i){
len=gi();
while(len--)C[i].push_back(gi()+200000);
}
S.push_back(233333);
P.push_back(0);
int sep=0;
for(int i=1;i<=n;++i){
S.insert(S.end(),A[i].begin(),A[i].end());
S.push_back(++sep);
for(int j=0;j<A[i].size();++j)P.push_back(i);
P.push_back(0);
}
for(int i=1;i<=n;++i){
S.insert(S.end(),B[i].begin(),B[i].end());
S.push_back(++sep);
for(int j=0;j<B[i].size();++j)P.push_back(i);
P.push_back(0);
}
for(int i=1;i<=m;++i){
S.insert(S.end(),C[i].begin(),C[i].end());
S.push_back(++sep);
P.push_back(-i);
for(int j=0;j<C[i].size();++j)P.push_back(0);
}
len=S.size()-1;
int tot=400000;
for(int i=1;i<=len;++i)++t[x[i]=S[i]];
for(int i=1;i<=tot;++i)t[i]+=t[i-1];
for(int i=len;i;--i)SA[t[x[i]]--]=i;
for(int k=1;k<=len;k<<=1){
int p=0;
for(int i=0;i<=tot;++i)y[i]=0;
for(int i=len-k+1;i<=len;++i)y[++p]=i;
for(int i=1;i<=len;++i)if(SA[i]>k)y[++p]=SA[i]-k;
for(int i=0;i<=tot;++i)t[i]=0;
for(int i=1;i<=len;++i)++t[x[y[i]]];
for(int i=1;i<=tot;++i)t[i]+=t[i-1];
for(int i=len;i;--i)SA[t[x[y[i]]]--]=y[i];
std::swap(x,y),x[SA[1]]=p=1;
for(int i=2;i<=len;++i)x[SA[i]]=cmp(SA[i],SA[i-1],k)?p:++p;
if(p>=len)break;tot=p;
}
for(int i=1;i<=len;++i)rk[SA[i]]=i;
int k=0;
for(int i=1;i<=len;++i){
if(rk[i]==len)continue;
if(k)--k;
int j=SA[rk[i]+1];
while(S[i+k]==S[j+k])++k;
ht[rk[i]]=k;
}
for(int i=2;i<=len;++i)lg[i]=lg[i>>1]+1;
for(int i=1;i<len;++i)st[0][i]=ht[i];
for(int i=1;i<=lg[len];++i)
for(int j=1;j+(1<<i)-1<len;++j)
st[i][j]=std::min(st[i-1][j],st[i-1][j+(1<<i-1)]);
for(int i=1;i<=len;++i)
if(P[SA[i]]<0){
int l=1,r=i,mid,sz=C[-P[SA[i]]].size();
while(l<r){
mid=(l+r)>>1;
if(query(mid,i-1)<sz)l=mid+1;
else r=mid;
}
int L=l;
ins[l].push_back(L);
LL[-P[SA[i]]]=l;
l=i,r=len;
while(l<r){
mid=(l+r)>>1;
if(query(i,mid)>=sz)l=mid+1;
else r=mid;
}
del[l+1].push_back(L);
p_del[l+1].push_back(-P[SA[i]]);
RR[-P[SA[i]]]=l;
}
for(int i=1;i<=len;++i){
if(P[SA[i]]>0){
update(Tree2,i,1);
if(lst[P[SA[i]]])update(Tree2,lst[P[SA[i]]],-1);
}
for(int j=0;j<ins[i].size();++j)update(Tree,ins[i][j],1);
for(int j=0;j<del[i].size();++j)update(Tree,del[i][j],-1);
if(P[SA[i]]>0){
ans1[P[SA[i]]]+=query(Tree,i)-query(Tree,lst[P[SA[i]]]);
lst[P[SA[i]]]=i;
}
for(int j=0;j<del[i+1].size();++j)ans2[p_del[i+1][j]]=query(Tree2,RR[p_del[i+1][j]])-query(Tree2,LL[p_del[i+1][j]]-1);
}
for(int i=1;i<=m;++i)printf("%d\n",ans2[i]);
for(int i=1;i<=n;++i)printf("%d ",ans1[i]);
puts("");
return 0;
}
洛咕 P2336 [SCOI2012]喵星球上的点名的更多相关文章
- 洛谷 P2336 [SCOI2012]喵星球上的点名 解题报告
P2336 [SCOI2012]喵星球上的点名 题目描述 a180285 幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有 \(N\) 个喵星人,每个喵星人的 ...
- 洛谷P2336 [SCOI2012]喵星球上的点名(后缀数组+莫队)
我学AC自动机的时候就看到了这题,想用AC自动机结果被学长码风劝退-- 学后缀数组时又看到了这题--那就写写后缀数组做法吧 结果码风貌似比当年劝退我的学长还毒瘤啊 对所有的模式串+询问串,不同串之间用 ...
- P2336 [SCOI2012]喵星球上的点名(后缀自动机+莫队+dfs序)
P2336 [SCOI2012]喵星球上的点名 名字怎么存?显然是后缀自动机辣 询问点到多少个喵喵喵其实就是 查询后缀自动机上parent树的一个子树 于是我们考虑莫队 怎么树上莫队呢 我们用dfs序 ...
- Luogu P2336 [SCOI2012]喵星球上的点名
题目链接 \(Click Here\)_ \(200\)行纯干货的代码,一发\(WA\)掉真的是让人窒息,幸好最后找到了锅在哪.(差点就要弃掉了\(QAQ\)) [调出来的时候真的是要高兴到哭出来了\ ...
- P2336 [SCOI2012]喵星球上的点名(SA+莫队)
题面传送门 一道还算有点含金量的 SA 罢-- 首先按照套路我们把读入的所有字符串都粘在一起,中间用分隔符隔开并建出后缀数组出来. 我们考虑对于一个固定的字符串 \(s\),什么样的字符串 \(t\) ...
- BZOJ 2754: [SCOI2012]喵星球上的点名 [后缀数组+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1906 Solved: 839[Submit][St ...
- 【BZOJ2754】[SCOI2012]喵星球上的点名
[BZOJ2754][SCOI2012]喵星球上的点名 题面 bzoj 洛谷 题解 这题有各种神仙做法啊,什么暴力\(AC\)自动机.\(SAM\)等等五花八门 我这个蒟蒻在这里提供一种复杂度正确且常 ...
- BZOJ 2754: [SCOI2012]喵星球上的点名
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 649 Solved: 305[Submit][Sta ...
- BZOJ2754: [SCOI2012]喵星球上的点名
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 680 Solved: 314[Submit][Sta ...
随机推荐
- 使用Webpack对Css文件压缩处理的思考
问题的起因: 使用 bulma.css ,通过webpack打包后样式出错,查看压缩代码,发现代码从css的 long hand 属性被压缩为 short hand(PS: 什么是long hand ...
- 在 Azure Resource Manager 中为虚拟机设置密钥保管库
Note Azure 具有两种不同的部署模型,用于创建和处理资源:Resource Manager 模型和经典模型.本文介绍使用 Resource Manager 部署模型.Azure 建议对大多数新 ...
- Oracle EBS 创建 RMA
DECLARE l_api_version_number NUMBER := 1; l_return_status VARCHAR2(2000); l_msg_count NUMBER; l_msg_ ...
- 浅析C#中的Attribute
原文地址:http://www.cnblogs.com/hyddd/archive/2009/07/20/1526777.html 一.什么是Attribute 先看下面的三段代码: 1.自定义Att ...
- [Python_4] Python 面向对象(OOP)
0. 说明 Python 面向对象(OOP) 笔记.迭代磁盘文件.析构函数.内置方法.多重继承.异常处理 参考 Python面向对象 1. 面向对象 # -*-coding:utf-8-*- &quo ...
- Docker容器学习与分享03
Docker容器的基本操作 所有的docker命令都是以docker开头,也就是指调用docker程序.我学习的第一个命令就是docker run,运行一个容器.以Docker分享02中的容器为例: ...
- Alpha冲刺报告(9/12)(麻瓜制造者)
今日已完成 邓弘立: 正在进行主页逻辑的编写 符天愉: 部署商品发布和物品需求的接口 江郑: 尝试完善接口文档,进行进一步测试 刘双玉: 编写接口说明 肖小强: 进行逻辑模块的编写 李佳铭: 修改了U ...
- 在HTML中使用object和embed标签插入视频
object标签和embed标签都能给页面添加多媒体内容: 一.object 对于object,w3c上定义object为一个嵌入的对象.可以使用此元素向您的 XHTML 页面添加多媒体.此元素允许您 ...
- python第三十七课——模块
3.模块(m) 概念:在python中.py结尾的文件,我们就称为模块,可以将类.函数.属性...等内容定义在模块中 分类: 1).标准库模块:安装完python环境就有的模块,这些模块都是最常用的模 ...
- 修改Centos7的网卡ens32 改为eth0
1. 修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-eno16777984 修改下面两个配置项 NAME=ens32 DEVICE=ens32 改 ...