【雅礼集训2017】字符串【后缀自动机】【数据分治】

题意:给定一个字符串SSSmmm个区间[li,ri][l_i,r_i][li,ri],qqq次询问,每次给定长度为kkk的字符串www和区间[a,b][a,b][a,b],求对于所有i∈[a,b]i\in[a,b]i[a,b]www[li,ri][l_i,r_i][li,ri]内的子串在SSS中出现次数之和。

∣S∣,m,∑∣w∣≤105|S|,m,\sum|w|\leq10^5S,m,w105

看上去很不可做,但是有一个很难注意到的特殊性质:所有www串长相等,所以kq≤105kq\leq10^5kq105。后面记kq=wkq=wkq=w

所以k,qk,qk,q中的较小值是根号级别的,考虑数据分治

首先肯定要先建出SSS的后缀自动机

k<qk<qk<q时,字符串很短,直接开k2k^2k2个vector记录所有区间出现的位置,然后暴力枚举www的子串,在对应的vector用aaabbb二分一下算出有多少个区间,乘上在后缀自动机上的size。复杂度O(qk2log⁡n)=O(wwlog⁡n)O(qk^2\log n)=O(w\sqrt w\log n)O(qk2logn)=O(wwlogn)

k>qk>qk>q时,询问很少,可以每次单独处理。每次读入www后先预处理出www的每个前缀iii 最长的 是SSS的子串 的 后缀长度LiL_iLi

然后暴力把[a,b][a,b][a,b]中的区间挂到rrr上,从左到右扫一遍,设当前处理[l,r][l,r][l,r],如果Lr<r−l+1L_r<r-l+1Lr<rl+1,说明这个子串没有出现过,直接跳过;否则在fail树上倍增找到最靠上的满足lenp≥r−l+1len_p\geq r-l+1lenprl+1的结点ppp,这个子串就出现了sizpsiz_psizp次。复杂度O(qmlog⁡n)=O(mwlog⁡n)O(qm\log n)=O(m\sqrt w\log n)O(qmlogn)=O(mwlogn)

某个k=qk=qk=q的点用SOLVE2会卡常,所以特判成了SOLVE1

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
#include <algorithm>
#define MAXN 200005
using namespace std;
int ch[MAXN][26],fa[MAXN],tot=1,las=1;
int len[MAXN],siz[MAXN];
void insert(int c)
{int p=las,cur=++tot;len[cur]=len[las]+1,las=cur;for (;p&&!ch[p][c];p=fa[p]) ch[p][c]=cur;if (!p) fa[cur]=1;else{int q=ch[p][c];if (len[q]==len[p]+1) fa[cur]=q;else{int _q=++tot;len[_q]=len[p]+1;fa[_q]=fa[q],fa[q]=fa[cur]=_q;memcpy(ch[_q],ch[q],sizeof(ch[q]));for (;ch[p][c]==q;p=fa[p]) ch[p][c]=_q;}}siz[cur]=1;
}
int a[MAXN],c[MAXN],up[MAXN][20];
inline void build(int n)
{for (int i=1;i<=tot;i++) ++c[len[i]];for (int i=1;i<=n;i++) c[i]+=c[i-1];for (int i=tot;i;i--) a[c[len[i]]--]=i;for (int i=1;i<=tot;i++){up[a[i]][0]=fa[a[i]];for (int j=1;j<20;j++) up[a[i]][j]=up[up[a[i]][j-1]][j-1];}for (int i=tot;i;i--) if (fa[a[i]]) siz[fa[a[i]]]+=siz[a[i]]; 
}
int n,m,k,q,l[MAXN],r[MAXN];
char s[MAXN],w[MAXN];
typedef long long ll;
namespace SOLVE1
{vector<int> lis[405][405];int pos[MAXN];void main(){for (int i=1;i<=m;i++) lis[l[i]][r[i]].push_back(i);while (q--){int a,b;scanf("%s%d%d",w+1,&a,&b);++a,++b;ll ans=0;for (int i=1;i<=k;i++){int now=1;for (int j=i;j<=k;j++){now=ch[now][w[j]-'a'];if (!now) break;ans+=(ll)siz[now]*(upper_bound(lis[i][j].begin(),lis[i][j].end(),b)-upper_bound(lis[i][j].begin(),lis[i][j].end(),a-1));}}printf("%lld\n",ans);}}
}
namespace SOLVE2
{vector<int> lis[MAXN];int pos[MAXN],maxl[MAXN];void main(){while (q--){int a,b;scanf("%s%d%d",w+1,&a,&b);++a,++b;ll ans=0;int now=1,curl=0;for (int i=a;i<=b;i++) lis[r[i]].push_back(l[i]);for (int i=1;i<=k;i++) {while (now&&!ch[now][w[i]-'a']) now=fa[now],curl=len[now];now=ch[now][w[i]-'a'],++curl;if (!now) now=1,curl=0;pos[i]=now,maxl[i]=curl;}for (int p=1;p<=k;p++)for (int j=0;j<(int)lis[p].size();j++){int u=pos[p],lim=p-lis[p][j]+1;if (maxl[p]<lim) continue;for (int i=19;i>=0;i--)if (len[up[u][i]]>=lim)u=up[u][i];ans+=siz[u];}printf("%lld\n",ans);for (int i=a;i<=b;i++) lis[r[i]].clear();}}
}
int main()
{scanf("%d%d%d%d",&n,&m,&q,&k);scanf("%s",s+1);for (int i=1;i<=n;i++) insert(s[i]-'a');build(n);for (int i=1;i<=m;i++) scanf("%d%d",&l[i],&r[i]),++l[i],++r[i];if (k<=q) SOLVE1::main();elseSOLVE2::main();return 0;
}

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

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

相关文章

AtCoder Regular Contest 100 E - Or Plus Max Sos dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为2n2^n2n的数组&#xff0c;让你对于所有的1≤k≤2n−11\le k\le 2^n-11≤k≤2n−1求最大的aiaj,0≤i<j≤2n−1,iorj≤ka_ia_j,0\le i<j\le2^n-1,i\ \ or \ \ j\le kai​aj​,0≤i<j≤…

使用Minikube部署本地Kubernetes集群(二十九)

前言 使用Minikube部署本地k8s集群相对比较简单&#xff0c;非常推荐将其用于本地k8s开发环境&#xff0c;唯一麻烦点的仅仅是网络问题。在本篇教程中&#xff0c;我们使用了国内的镜像来完成本地k8s集群的搭建。如果搭建过程中出现错误&#xff0c;建议使用mini…

Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) F. Bits And Pieces sosdp预处理超集

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤1e6,ai≤2e6n\le1e6,a_i\le2e6n≤1e6,ai​≤2e6 思路&#xff1a; 由于(aj&ak)(a_j \And a_k)(aj​&ak​)打的括号&#xff0c;所以应该放在一起考虑&#xff0c;现在我们可以枚举aia_iai​&…

【PKUWC2018】随机算法【状压dp】【组合计数】

题意&#xff1a;一张nnn个点mmm条边的无向无权图&#xff0c;求以下算法计算最大独立集的正确率&#xff1a;随机一个排列&#xff0c;依次考虑排列中每一个点&#xff0c;如果不与任何一个独立集中的点相邻则将其加入独立集。模998244353998244353998244353。 n≤20n\leq20n≤…

架构杂谈《一》

架构杂谈《一》从传统单体架构到服务化架构的发展历程典型的单体架构分为三个层级&#xff0c;Web层、业务逻辑层和数据存储层&#xff0c;每个层的指责分别如下&#xff1a;Web 层&#xff1a;负责与用户交互或者对外提供接口业务逻辑层&#xff1a;为了实现业务逻辑而设计的流…

hdu 3308 LCIS 线段树 + 区间合并

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 日常水一篇题解。 带修改的求区间连续的递增序列&#xff0c;我们考虑用线段树维护。 直接维护mlenmlenmlen是区间最长的递增序列&#xff0c;lslsls是从左端点开始的最长递增序列&#xf…

【ARC103D】Distance Sums【树论】【构造】

题意&#xff1a;一棵nnn个点的无权树&#xff0c;给定每个点iii到其他所有点的距离之和did_idi​&#xff0c;保证did_idi​两两不同。构造或判断无法构造一棵满足条件的树。 n≤105n\leq 10^5n≤105 首先对于非根结点uuu&#xff0c;有 dudfau−sizu(n−sizu)d_ud_{fa_u}-si…

从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板

标题&#xff1a;从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板作者&#xff1a;Lamond Lu地址&#xff1a;https://www.cnblogs.com/lwqlun/p/11155666.html源代码&#xff1a;https://github.com/lamondlu/DynamicPlugins在上一篇中&#xff0c;我们介绍…

Codeforces Round #112 (Div. 2) E. Compatible Numbers sosdp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 以下假设all1<<22all1<<22all1<<22。 转化问题&#xff0c;对于每个aia_iai​我们都计算xaixorallxa_i\ \ xor \ \ allxai​ xor all&#xff0c;对于所有xxx的子集都…

【CF1349D】Slime and Biscuits【概率期望】【解方程】

题意&#xff1a;nnn个人共有mmm个饼干&#xff0c;每轮随机选一个饼干随机给一个另外的人&#xff0c;所有饼干都在一个人手里时游戏结束&#xff0c;求期望进行次数。模998244353998244353998244353。 n≤105,m≤3105n\leq10^5,m\leq3\times10^5n≤105,m≤3105 首先肯定是每…

多租户通用权限设计(基于 casbin)

所谓权限控制, 概念并不复杂, 就是确认某个操作是否能做, 本质上仅仅就是个bool判断.权限几乎是每个系统必不可少的功能, 和具体业务结合之后, 在系统中往往表现的非常复杂和难于控制, 很大部分原因是把权限和具体业务结合的太过紧密, 把业务的复杂度也加入到权限控制中来了.一…

Codeforces Round #225 (Div. 1) E. Vowels 容斥 + sosdp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你nnn个长度为333的串&#xff0c;串的每个字母都在a−za-za−z范围内&#xff0c;定义一个串合法当且仅当这个串中含有至少一个元音字母。现在他忘记了元音字母都有那几个&#xff0c;显然有2242^{24}224…

【CF1344D】Résumé Review【数学】【二分】

题意&#xff1a;给定长度为nnn的自然数序列aaa和整数kkk&#xff0c;要求构造长度为nnn的自然数序列bbb&#xff0c;使得0≤bi≤ai,∑bik0\leq b_i\leq a_i,\sum b_ik0≤bi​≤ai​,∑bi​k&#xff0c;且∑bi(ai−bi2)\sum b_i(a_i-b_i^2)∑bi​(ai​−bi2​)最大化。 n≤105…

容器化单页面应用中RESTful API的访问

最近在工作中&#xff0c;需要让运行在容器中的单页面应用程序能够访问外部的RESTful API。这个需求看起来并不困难&#xff0c;不过实现起来还是有些曲折的。在此&#xff0c;我就将这部分内容总结一下。在入正题之前&#xff0c;有个一问题&#xff0c;就是为什么要将单页面应…

2020牛客暑期多校训练营(第六场)H.Harmony Pairs 数位dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个nnn&#xff0c;问你有多少对0≤a≤b≤n0\le a\le b\le n0≤a≤b≤n满足S(a)>S(b)S(a)>S(b)S(a)>S(b)。其中S(a)S(a)S(a)表示aaa的十进制各位数之和。 思路&#xff1a; 显然的数位dpdpd…

【PKUWC2018】随机游走【Min-Max容斥】【树形dp】【FWT】

题意&#xff1a;给一棵nnn个点的无权树和xxx&#xff0c;qqq次询问&#xff0c;每次给定一个点集SSS,询问从xxx开始每次随机走一步&#xff0c;SSS中的每个点至少被经过一次的期望步数。 n≤18,q≤5000n\leq 18,q\leq 5000n≤18,q≤5000 题目求的相当于是SSS中的所有点 第一次…

LogoSharp:Logo语言的C#实现

上周在朋友中问了一圈&#xff0c;发现没有几个人知道Logo语言的&#xff0c;或许&#xff0c;这门古老的语言现在用的人已经非常少了&#xff0c;除了国外有少量的用户将Logo语言用于教育外&#xff0c;估计国内不会有人使用这门语言。其实&#xff0c;Logo语言本来也就是以编…

hdu 6899 Xor 数位dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 问你有多少对x,yx,yx,y满足以下条件&#xff1a; (1)x∈[0,A],y∈[0,B](1)x \in [0,A],y\in [0,B](1)x∈[0,A],y∈[0,B] (2)∣x−y∣≤K(2)|x-y|\le K(2)∣x−y∣≤K (3)xxory≤W(3)x \ \ xor \ \ y\le W(3)…

【PKUWC2018】Minimax【线段树合并】

题意&#xff1a;给定一棵nnn个点的二叉树&#xff0c;叶子的权值输入给定且互不相同&#xff0c;非叶子结点iii的权值有pip_ipi​的概率为儿子结点权值最大值&#xff0c;1−pi1-p_i1−pi​的概率为最小值。求根结点取每种值的概率。模998244353998244353998244353。 n≤3105n…

对数位dp的一些拙见

这不是一篇介绍数位dpdpdp的文章&#xff0c;只是我思考后的一些记录&#xff0c;怕以后就忘记了。 由于博主太菜不会组合数学&#xff0c;以下数位dpdpdp均采用记忆化搜索的方式。 首先最重要的就是状态设计了&#xff0c;正常来说数位dpdpdp的状态设计需要包含数的结构和状态…