【NOI2016】优秀的拆分【后缀数组】【ST表】【关键点】【调和级数复杂度】【差分】

传送门

题意:如果一个字符串可以拆分为AABB的形式,其中A和B是任意非空字符串,则我们这种拆分是优秀的。求给定串的所有子串的拆分方案数之和。

N≤30000N \leq30000N30000

本来是个神仙题

但明明一个O(nlogn)O(nlogn)O(nlogn)的题为啥只出300003000030000啊(而且只有一个点)……搞不懂

显然求出所有位置作为AA的开始和结束位置有多少个然后乘一下加起来

接下来是个神奇做法

枚举我们要求的长度lenlenlen,然后每隔lenlenlen记录一个关键点

这样每个长度为2∗len2*len2len的AA都恰好经过两个相邻关键点,我们用这两个关键点计算贡献。

在这里插入图片描述
用后缀数组算出它们向前和向后的最长的相同长度

如果中间没有相交

在这里插入图片描述那么是没有贡献的

如果有相交,把相交这段标为蓝色\textcolor{blue}{蓝色}
在这里插入图片描述
我们发现A可以等于蓝色\textcolor{blue}{蓝色}+绿色\textcolor{green}{绿色}绿+紫色\textcolor{purple}{紫色}

挪到后面也可以等于绿色\textcolor{green}{绿色}绿+紫色\textcolor{purple}{紫色}+蓝色\textcolor{blue}{蓝色}

中间随便截一段也是合法的

用个差分即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#define MAXN 30005
using namespace std;
typedef long long ll;
int LOG[MAXN];
char s[MAXN];
int n;
struct SuffixArray
{int sa[MAXN],rk[MAXN],tp[MAXN];int c[MAXN],ht[MAXN];int st[MAXN][20];int m;void Rsort(){for (int i=1;i<=m;i++) c[i]=0;for (int i=1;i<=n;i++) ++c[rk[i]];for (int i=1;i<=m;i++) c[i]+=c[i-1];for (int i=n;i>=1;i--) sa[c[rk[tp[i]]]--]=tp[i];}void build(){memset(rk,0,sizeof(rk));memset(sa,0,sizeof(sa));memset(tp,0,sizeof(tp));m='z';for (int i=1;i<=n;i++) rk[i]=s[i],tp[i]=i;Rsort();for (int w=1,p=0;p<n;w<<=1,m=p){p=0;for (int i=n-w+1;i<=n;i++) tp[++p]=i;for (int i=1;i<=n;i++) if (sa[i]>w) tp[++p]=sa[i]-w;Rsort();swap(rk,tp);rk[sa[1]]=p=1;for (int i=2;i<=n;i++)if (tp[sa[i]]==tp[sa[i-1]]&&tp[sa[i]+w]==tp[sa[i-1]+w]) rk[sa[i]]=p;else rk[sa[i]]=++p;}int k=1;for (int i=1;i<=n;i++){if (k) --k;int j=sa[rk[i]-1];while (s[i+k]==s[j+k]) ++k;ht[rk[i]]=k;}memset(st,0,sizeof(st));for (int i=1;i<=n;i++) st[i][0]=ht[i];for (int j=1;j<20;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]);}inline int query_st(int l,int r){int t=LOG[r-l+1];return min(st[l][t],st[r-(1<<t)+1][t]);}inline int query(int x,int y){if (rk[x]>rk[y]) swap(x,y);return query_st(rk[x]+1,rk[y]);}
}A,B;
#define lcp B.query
#define lcs A.query
int p[MAXN],q[MAXN];
int main()
{LOG[0]=-1;for (int i=1;i<MAXN;i++) LOG[i]=LOG[i>>1]+1;int T;scanf("%d",&T);while (T--){scanf("%s",s+1);n=strlen(s+1);A.build();reverse(s+1,s+n+1);B.build();    for (int i=1;i<=n;i++) p[i]=q[i]=0;for (int len=1;len<=n;len++)for (int i=len;i+len<=n;i+=len){int j=i+len;int a=min(lcp(n-i+1,n-j+1),len),b=min(lcs(i,j),len);if (a+b<=len) continue;int s=a+b-len-1;++p[i-a+1];--p[i-a+s+2];++q[i-a+2*len];--q[i-a+s+2*len+1];   }for (int i=1;i<=n;i++) p[i]+=p[i-1],q[i]+=q[i-1];ll ans=0;for (int i=1;i<n;i++) ans+=(ll)q[i]*p[i+1];printf("%lld\n",ans);}return 0;
}

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

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

相关文章

剑指 Offer 43. 1~n 整数中 1 出现的次数(数位dp)

思路&#xff1a;就是数位dp&#xff0c;dp[idx][sum][limit]代表&#xff0c;到idx位&#xff0c;前面有sum个0&#xff0c;有没有limit限制&#xff1b; class Solution { public:int dp[20][50][2];int len; int pos[20];int countDigitOne(int n) {for(int i0;i<15;i)f…

Windows新终端中玩转ASCII和Emoji游戏的正确姿势

前一段时间&#xff0c;我搬运了几个Windows Terminal中玩游戏的视频.Windows Terminal - 动图GIF作背景图Windows Terminal - 母牛说HiWindows Terminal - 字符水族箱今天我来给大家展示一下具体的玩法~Emoji版双人碰碰球目前有个现成的 .NET core 项目可以直接用&#xff0c;…

剑指 Offer 38. 字符串的排列(有重复元素的排列)

思路&#xff1a;dfs 暴搜 class Solution { public:vector<string> permutation(string s) {vector<string> a;function<bool(char,int,int)> check[&](char x,int st,int idx){if(st>idx) return false;for(int ist;i<idx;i) if(s[i]x) return …

nowcoder Forsaken的数列 fhq-treap

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 很明显的数据结构了&#xff0c;splaysplaysplay当然能写&#xff0c;但是fhq−treapfhq-treapfhq−treap更加简洁易懂。 考虑第一个操作&#xff0c;无非就是分裂出[1,pos−1][1,pos-1][1…

我与微软的不解之缘 - 我的Insider Dev Tour 2019讲师之旅

作者&#xff1a;Lamond Lu大家好&#xff0c;我是陆楠&#xff0c;来自北京盛安德科技发展有限公司青岛分公司&#xff0c;今年非常有幸作为讲师参加了微软Insider Dev Tour烟台站的活动&#xff0c;我主讲了如何使用最新的微软开发工具开发调试NodeJS项目。与微软结缘与大多数…

.NET Core 3.0之深入源码理解Kestrel的集成与应用(一)

写在前面ASP.NET Core 的 Web 服务器默认采用Kestrel&#xff0c;这是一个基于libuv(一个跨平台的基于Node.js的异步I/O库)的跨平台、轻量级的Web服务器。在开始之前&#xff0c;先回顾一下.NET Core 3.0默认的main()方法模板中&#xff0c;我们会调用Host.CreateDefaultBuilde…

P2596 [ZJOI2006]书架 无旋treap 按照排名分裂

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 实现如下操作&#xff1a; 思路&#xff1a; fhq-treap板子辣&#xff0c;不要被他的编号误导了&#xff0c;我们还是需要按照排名来分裂&#xff0c;从上到下标号1−n1-n1−n即可&#xff0c;注意在按照…

【水】几个网络流图论模型的记录

DAG相关 最小路径覆盖 定义&#xff1a;最少不重路径覆盖DAG 初始时每个点是独立的 之后每次加一条边把两个点连到一起 因为只能用一次&#xff0c;所以是个最大匹配 最小路径覆盖N-拆点后最大匹配\text{最小路径覆盖N-拆点后最大匹配}最小路径覆盖N-拆点后最大匹配 最小链…

surging 微服务引擎 2.0 会有多少惊喜?

surging 微服务引擎从2017年6月至今已经有两年的时间&#xff0c;这两年时间有多家公司使用surging 服务引擎&#xff0c;并且有公司搭建了CI/CD&#xff0c;并且使用了k8s 集群&#xff0c;这里我可以说下几家公司的服务搭建情况&#xff0c;公司名不便透露&#xff0c;我们就…

Codeforces Round #630 (Div. 2) E. Height All the Same 排列组合

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 由于n,mn,mn,m都很大&#xff0c;不难猜到这是一个公式题。 首先化简题目中的两个操作&#xff0c;第二个操作就是可以让奇偶性相同的位置的高度相同。第一个操作虽然是改变相邻两个的奇偶…

对产品质量的一点思考

不管是做产品还是做项目&#xff0c;也不管是采用瀑布模型还是敏捷开发&#xff0c;我们都有一个终极目标&#xff0c;就是能按时交付质量可靠的功能&#xff0c;其中质量尤为重要。本文是我对产品质量的一点思考&#xff0c;如果您所在的团队代码质量很高&#xff0c;很少出BU…

正确使用AES对称加密

正确使用AES对称加密经常我看到项目中有人使用了对称加密算法&#xff0c;用来加密客户或项目传输中的部分数据。但我注意到开发 人员由于不熟悉原理&#xff0c;或者简单复制网上的代码示例&#xff0c;有导致代码存在安全风险。我经常遇到的问题&#xff0c;有如下&#xff1…

Codeforces Round #709 (Div. 1) C. Skyline Photo dp + 单调栈优化

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先一个非常明显的dpdpdp式子就是f[i]max(f[j]val(j1,i))f[i]max(f[j]val(j1,i))f[i]max(f[j]val(j1,i))&#xff0c;其中val(j1,i)val(j1,i)val(j1,i)是[j1,i][j1,i][j1,i]中高度最小的美…

「数据分析」Sqlserver中的窗口函数的精彩应用之数据差距与数据岛(含答案)...

上一篇介绍过数据差距与数据岛的背景&#xff0c;这里不再赘述&#xff0c;请翻阅上一文。此篇在Sqlserver上给大家演示1000万条记录的计算性能。测试电脑软硬件说明一般般的笔记本电脑&#xff0c;2017年7月&#xff0c;价格&#xff1a;4500。电脑配置数据构造1000万行数据&a…

Codeforces Round #631 (Div. 2) C. Dreamoon Likes Coloring 构造

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 针灸思维不行&#xff0c;数据结构来凑呗。 一开始做的时候想简单了&#xff0c;一直wawawa&#xff0c;后来想到了hackhackhack样例&#xff0c;开始换思路构造&#xff0c;结果死活想不到…

用象棋的思维趣说IT人的职业发展和钱途

最近我花了不少功夫在学习象棋&#xff0c;也学习了王天一等高手的棋路&#xff0c;感觉IT人的职业和下棋一样&#xff0c;往好了讲&#xff0c;争主动权争实惠只争朝夕&#xff0c;往坏了讲&#xff0c;一步走错得用多步来弥补&#xff0c;如果错误太大未必能弥补回来。在本文…

Codeforces Round #631 (Div. 2) D. Dreamoon Likes Sequences 思维 + 组合数学

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你d,modd,modd,mod&#xff0c;让你求能构造出如下序列aaa的个数模modmodmod&#xff1a; 思路&#xff1a; 首先可以发现aaa的长度不能超过log2dlog_2dlog2​d&#xff0c;因为如果存在两个aaa的二进制…

基于 Roslyn 实现动态编译

基于 Roslyn 实现动态编译Intro之前做的一个数据库小工具可以支持根据 Model 代码文件生成创建表的 sql 语句&#xff0c;原来是基于 CodeDom 实现的&#xff0c;最近改成使用基于 Roslyn 去做了。实现的原理在于编译选择的Model 文件生成一个程序集&#xff0c;再从这个程序集…

Codeforces Round #212 (Div. 2) C. Insertion Sort 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤5000n\le5000n≤5000 思路&#xff1a; 从dpdpdp题集中看到的&#xff0c;一看n≤5000n\le5000n≤5000&#xff0c;这不就乱搞就行了&#xff0c;哪有什么dpdpdp&#x1f986;。 看到冒泡排序&#xff0…

[Abp vNext 源码分析] - 4. 工作单元

一、简要说明统一工作单元是一个比较重要的基础设施组件&#xff0c;它负责管理整个业务流程当中涉及到的数据库事务&#xff0c;一旦某个环节出现异常自动进行回滚处理。在 ABP vNext 框架当中&#xff0c;工作单元被独立出来作为一个单独的模块(Volo.Abp.Uow)。你可以根据自己…