P2336-[SCOI2012]喵星球上的点名【SA,树状数组】

正题

题目链接:https://www.luogu.com.cn/problem/P2336


题目大意

nnn个名字(每个名字两个串),mmm次点名,如果一次点名里是一个名字两个串中的子串该人就要答到。

对于每次点名求多少个人答到,每个名字求答到多少次。


解题思路

先考虑第一问,我们将所有串串在一起(中间加大数)然后跑出SASASA和所有的LCPLCPLCP

然后对于每个点名串起始位置kkk我们寻找一个区间[l,r][l,r][l,r]使得LCP(k,i)≥len(i∈[l,r])LCP(k,i)\geq len(i\in[l,r])LCP(k,i)len(i[l,r])

这个区间我们求出heightheightheight后用STSTST表+二分可以求出

这样如果任意一个名字串的在这个区间内就会被点到。因为有名有姓,我们把同一个名字的SASASA染成同一种颜色,这样问题就变为了在[l,r][l,r][l,r]这个区间内有多少种颜色

而第二问也变为了有多少个区间包含该种颜色,我们直接用树状数组做就好了。

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define lowbit(x) (x&-x)
using namespace std;
const int N=5e5+10;
struct node{int l,r,id;
}q[N];
int n,m,num,Q,s[N];
int col[N],len[N],head[N];
int sa[N],c[N],x[N],y[N];
int rk[N],height[N];
int st[N][20],lg[N];
int pre[N],last[N],qq[N];
int ans1[N],ans2[N];
struct Tree_Array{int t[N];void Change(int x,int val){if(!x) return;while(x<=n){t[x]+=val;x+=lowbit(x);}return;}int Ask(int x){int ans=0;while(x){ans+=t[x];x-=lowbit(x);}return ans;}
}T1,T2;
void Init(){scanf("%d%d",&num,&Q);m=1e4;for(int i=1;i<=num;i++){for(int j=0;j<2;j++){int x,c;scanf("%d",&x);while(x--){scanf("%d",&c);s[++n]=c;col[n]=i;}s[++n]=++m;}}for(int i=1;i<=Q;i++){int x;head[n+1]=i;scanf("%d",&len[i]);for(int j=1;j<=len[i];j++){scanf("%d",&x);s[++n]=x;col[n]=-i;}s[++n]=++m;}
}
void Qsort(){for(int i=1;i<=m;i++)c[i]=0;for(int i=1;i<=n;i++)c[x[i]]++;for(int i=1;i<=m;i++)c[i]+=c[i-1];for(int i=n;i>=1;i--)sa[c[x[y[i]]]--]=y[i],y[i]=0;return;
}
void Get_SA(){for(int i=1;i<=n;i++)x[i]=s[i],y[i]=i;Qsort();for(int w=1;w<=n;w<<=1){int p=0;for(int i=n-w+1;i<=n;i++) y[++p]=i;for(int i=1;i<=n;i++)if(sa[i]>w) y[++p]=sa[i]-w;Qsort();swap(x,y);x[sa[1]]=p=1;for(int i=2;i<=n;i++)x[sa[i]]=(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+w]==y[sa[i-1]+w])?p:++p;if(p==n) break;m=p;}return;
}
void Get_Height(){int k=0;for(int i=1;i<=n;i++)rk[sa[i]]=i;for(int i=1;i<=n;i++){//if(rk[i]==1) continue;if(k) k--;int j=sa[rk[i]-1];while(i+k<=n&&j+k<=n&&s[i+k]==s[j+k]) k++;height[rk[i]]=k;}return;
}
void Get_ST(){lg[0]=-1;for(int i=1;i<=n;i++)st[i][0]=height[i],lg[i]=lg[i>>1]+1;for(int j=1;j<19;j++)for(int i=1;i+(1<<j-1)<=n;i++)st[i][j]=min(st[i][j-1],st[i+(1<<j-1)][j-1]);return;
}
int LCP(int l,int r){if(l==r) return 1e9+7;if(l>r) swap(l,r);l++;int z=lg[r-l+1];return min(st[l][z],st[r+1-(1<<z)][z]);
}
bool cmp(node x,node y)
{return x.r<y.r;}
void Get_Pre(){for(int i=1;i<=n;i++){if(col[sa[i]]>0){pre[i]=last[col[sa[i]]];last[col[sa[i]]]=i;}if(head[i]){int l=1,r=rk[i];while(l<=r){int mid=(l+r)>>1;if(LCP(mid,rk[i])>=len[head[i]]) r=mid-1;else l=mid+1;}q[head[i]].l=l;l=rk[i];r=n;while(l<=r){int mid=(l+r)>>1;if(LCP(rk[i],mid)>=len[head[i]]) l=mid+1;else r=mid-1;}q[head[i]].r=r;q[head[i]].id=head[i];qq[q[head[i]].l]++;}}sort(q+1,q+1+Q,cmp);
}
void Get_Ans(){int h=1,z=1;for(int i=1;i<=n;i++){T2.Change(i,qq[i]);if(col[sa[i]]>0){T1.Change(pre[i],-1);T1.Change(i,1);ans2[col[sa[i]]]+=T2.Ask(i)-T2.Ask(pre[i]);}while(h<=Q&&q[h].r<=i){ans1[q[h].id]+=T1.Ask(q[h].r)-T1.Ask(q[h].l-1);T2.Change(q[h].l,-1);h++;}}return;
}
int main()
{Init();Get_SA();Get_Height();Get_ST();Get_Pre();Get_Ans();for(int i=1;i<=Q;i++)printf("%d\n",ans1[i]);for(int i=1;i<=num;i++)printf("%d ",ans2[i]);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11、oracle数据库下的事务和触发器

ORACLE下的事务和触发器 1.事务 事务是数据库的一种机制&#xff0c;当执行一系列操作时&#xff0c;事务可以保证这一系列操作都能完成&#xff0c;在此期间如果出现问题&#xff0c;则这一系列操作导致的结果均回退到原始状态。这样就保证了数据的一致性&#xff0c;事务在…

微软发布自己定制的 Linux 内核和发行版,面向物联网

微软首次发布了自己的定制 Linux 内核和发行版。在旧金山举行的新闻发布会上&#xff0c;微软宣布了针对物联网设备的解决方案 Azure Sphere。Azure Sphere 包含三个组件。其中之一是微软设计的 Sphere MCU&#xff0c;将免费提供给厂商&#xff0c;联发科将在今年晚些时候推出…

P3804-[模板]后缀自动机【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/P3804 题目大意 长度为nnn的串&#xff0c;求一个出现次数不小于2的子串使得子串长度乘上出现次数最大。 解题思路 构建SAMSAMSAM的时候统计一下每个子串出现多少次即可。 codecodecode #include<cstdio> #include&l…

MEDIATR 一个低调的中介者类库

微软官方的开源项目eShopOnContainers中&#xff0c;用到了一个实现中介者模式的类库&#xff1a;MediatR。这个类库的作者叫Jimmy Bogard&#xff0c;在其gtihub主页上可以看到&#xff0c;注明的对象映射组件AutoMapper 就是他写的。其博客上的自我介绍是这么写的&#xff1a…

12、oracle数据库下的存储过程和函数

ORACLE下的存储过程和函数 存储过程和函数是一种操作块&#xff0c;用来流程化、整体化处理业务逻辑的数据库操作方式。我理解的是相当于java开发语言中方法的概念&#xff0c;存储过程和函数的区别在于函数可以有返回值&#xff0c;而过程没有返回值。 1.存储过程 -- 创建存…

Codeforces Gym 101173 CERC 16 D BZOJ 4790 Dancing Disks

Codeforces Gym 101173 CERC 16 D & BZOJ 4790 Dancing Disks 强烈安利这道构造题目&#xff0c;非常有意思。 这里用到的思想是归并排序&#xff01; 多路归并排序&#xff01; 我们这样想&#xff0c;假设6*6的网格中除了最后一个网格外&#xff0c;其他的凡是有元素…

P5496-[模板]回文自动机【PAM】

正题 题目链接:https://www.luogu.com.cn/problem/P5496 题目大意 长度为nnn的字符串&#xff0c;求每个字符串作为结尾有多少个回文串。 解题思路 PAMPAMPAM。 下面是个人对PAMPAMPAM的一些理解(不是讲解)&#xff1a; 每个节点表示一个回文串&#xff0c;就是根到其的路径…

ApacheSkyWalking APM 生态衍生多语言监控, 支持 .NET Core

Apache SkyWalking .NET core 探针发布&#xff01;GitHub: https://github.com/apache/incubator-skywalking 码云Gitee: https://gitee.com/OpenSkywalking/sky-walkingApache SkyWalking在4月初&#xff0c;发布了加入Apache孵化器后的第一个版本&#xff1a;5.0.0-alpha。…

13、oracle数据库下的游标

ORACLE下的游标操作 游标是sql的一个内存工作区&#xff0c;由系统或者用户以变量的形式定义。游标的作用是用于临时存储从数据库中提取的数据块。游标有静态游标、动态游标之分&#xff0c;静态游标又可分为隐式游标和显式游标。静态游标是在编译时期就决定了结果集的&#x…

背包系列

庆功会&#xff08;ssl 2289&#xff09; Description 为了庆贺班级在校运动会上取得第一名的成绩&#xff0c;班主任决定开一场庆功会&#xff0c;为此拔款购买奖品奖励运动员&#xff0c;期望拔款金额能购买最大价值的奖品&#xff0c;可以补充他们的精力和体力。 Input …

使用TFS CI/CD 完成 VSTS 插件自动化部署和发布

Visual Studio Team Service 经过了13年的版本演进和5年的在线运营&#xff0c;现在已经是最成熟的商用DevOps工具链&#xff0c;Marketplace作为VSTS为全球开发者提供各种类型的插件市场&#xff0c;为Visual Studio, Visual Studio Code和Visual Studio Team Service本身提供…

P4248-[AHOI2013]差异【SAM or SA】

正题 题目链接:https://www.luogu.com.cn/problem/P4248 题目大意 TiT_iTi​表示后缀i∼ni\sim ni∼n 一个字符串求 ∑i1n∑jinlen(Ti)len(Tj)−2∗lcp(Ti,Tj)\sum_{i1}^n\sum_{ji}^nlen(T_i)len(T_j)-2*lcp(T_i,T_j)i1∑n​ji∑n​len(Ti​)len(Tj​)−2∗lcp(Ti​,Tj​) 解题…

14、ORACLE下的基本SQL操作

ORACLE下的基本SQL操作 1.获取表字段 select * from user_tab_columns where Table_Name用户表 order by column_name2.获取表注释 select * from user_tab_comments where Table_Name用户表 order by Table_Name3.获取字段注释 select * from user_col_comments where Table_…

暗黑破坏神(ssl 2295)

暗黑破坏神&#xff08;ssl 2295&#xff09; Description 无聊中的小x玩起了Diablo I... 游戏的主人公有n个魔法 每个魔法分为若干个等级&#xff0c;第i个魔法有p[i]个等级(不包括0) 每个魔法的每个等级都有一个效果值&#xff0c;一个j级的i种魔法的效果值为w[i][j] 魔法升…

用C# (.NET Core) 实现迭代器设计模式

本文的概念来自深入浅出设计模式一书项目需求有两个饭店合并了, 它们各自有自己的菜单. 饭店合并之后要保留这两份菜单.这两个菜单是这样的:菜单项MenuItem的代码是这样的:最初我们是这样设计的, 这是第一份菜单:这是第2份菜单:同时有两个菜单存在的问题问题就是多个菜单把事情…

P4287-[SHOI2011]双倍回文【PAM】

正题 题目链接:https://www.luogu.com.cn/problem/P4287 题目大意 长度为nnn的字符串。定义wRw^RwR表示字符串www的翻转。 一个双倍回文可以表示为wwRwwRww^Rww^RwwRwwR且这是个回文串。 求最长的子串是双倍回文。 解题思路 我们在构建PAMPAMPAM的时候维护一个halfhalfhal…

2020-09-18

1.处理调用子组件方法时&#xff0c;报错undefined问题 2.var 、const 、let区别 3. curl -X GET --header "Accept: */*" "访问地址" 4.mysql中的日期格式化 5. ant-design-vue-jeecg

低价购买(洛谷 1108)

低价购买&#xff08;洛谷 1108&#xff09; 题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则。要想被认为是伟大的投资者&#xff0c;你必须遵循以下的问题建议:“低价购买&#xff1b;再低价购买”。每次你购买一支股票,你必须用低于你上次购买它的价格购…

.NET Core/.NET之Stream简介

之前写了一篇C#装饰模式的文章用.NET Core实现装饰模式和.NET Core的Stream简介 提到了.NET Core的Stream, 所以这里尽量把Stream介绍全点. (都是书上的内容).NET Core/.NET的Streams首先需要知道, System.IO命名空间是低级I/O功能的大本营.Stream的结构.NET Core里面的Stream主…

P4762-[CERC2014]Virus synthesis【PAM,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4762 题目大意 长度为nnn的目标串&#xff0c;开始一个空串&#xff0c;可以执行以下操作 在头或者尾加一个字符复制一个该串的逆串放在后面 求最少操作次数。 解题思路 我们可以知道答案肯定是一个回文串然后剩下的暴力…