loj6626 幼儿园唱歌题
不难想到把\(S\)的反串\(S^R\)接到\(S\)后面,这样就可以把\(S[l_1,r_1]\)的前缀转化为\(S^R[n-r_1+1,n-l_1+1]\)的后缀
回文树上两节点的lca就是两个前缀的最长公共回文后缀,于是建出回文树来跑个lca就好了
之后这个lca可能太长了,长度超过了\(\min(r_2-l_2+1,r_1-l_1+1)\),于是我们再倍增往上跳一跳使得长度更小一些就好了
注意把两个串拼起来的时候要插两个特殊字符
代码
1#include<bits/stdc++.h>
#define re register
#define min(a,b) ((a)<(b)?(a):(b))
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=4e5+7;char S[maxn];
int fa[maxn],son[maxn][28],len[maxn],cnt,lst,pos[maxn],lg[maxn],dep[maxn];
int f[20][maxn],n,Q;
inline void ins(int c,int n) {
int F=lst;
while(S[n-len[F]-1]!=S[n]) F=fa[F];
if(!son[F][c]) {
int p=++cnt,k=fa[F];len[p]=len[F]+2;
while(S[n-len[k]-1]!=S[n]) k=fa[k];
fa[p]=son[k][c];son[F][c]=p;dep[p]=dep[fa[p]]+1;f[0][p]=fa[p];
for(re int i=1;i<=lg[dep[p]];++i) f[i][p]=f[i-1][f[i-1][p]];
}
lst=son[F][c];pos[n]=lst;
}
inline int LCA(int x,int y) {
if(dep[x]<dep[y]) std::swap(x,y);
for(re int i=lg[dep[x]];i>=0;--i)
if(dep[f[i][x]]>=dep[y]) x=f[i][x];
if(x==y) return x;
for(re int i=lg[dep[x]];i>=0;--i)
if(f[i][x]!=f[i][y]) x=f[i][x],y=f[i][y];
return fa[x];
}
inline int get(int x,int l) {
if(len[x]<=l) return len[x];
for(re int i=lg[dep[x]];i>=0;--i)
if(len[f[i][x]]>l) x=f[i][x];
return len[fa[x]];
}
int main() {
n=read();Q=read();scanf("%s",S+1);S[0]=-1;for(re int i=1;i<=n;i++) S[i]-='a';
S[n+1]=26,S[n+2]=27;for(re int i=1;i<=n;i++) S[n+i+2]=S[n-i+1];
for(re int i=2;i<=n+n+2;i++) lg[i]=lg[i>>1]+1;
len[1]=-1,fa[0]=1;cnt=1;dep[1]=1;dep[0]=2;
for(re int i=1;i<=n+n+2;i++) ins(S[i],i);
for(re int x,y,l1,l2,r1,r2;Q;Q--) {
l1=read(),r1=read(),l2=read(),r2=read();
x=pos[r2],y=pos[n+2+n-l1+1];int t=LCA(x,y);
printf("%d\n",-1*get(t,min(r1-l1+1,r2-l2+1)));
}
return 0;
}
loj6626 幼儿园唱歌题的更多相关文章
- 【洛谷2791】幼儿园篮球题(第二类斯特林数,NTT)
[洛谷2791]幼儿园篮球题(第二类斯特林数,NTT) 题面 洛谷 题解 对于每一组询问,要求的东西本质上就是: \[\sum_{i=0}^{k}{m\choose i}{n-m\choose k-i ...
- 洛谷 P2791 幼儿园篮球题
洛谷 P2791 幼儿园篮球题 https://www.luogu.org/problemnew/show/P2791 我喜欢唱♂跳♂rap♂篮球 要求的是:\(\sum_{i=0}^kC_m^iC_ ...
- 【题解】幼儿园篮球题(范德蒙德卷积+斯特林+NTT)
[题解]幼儿园篮球题(NTT+范德蒙德卷积+斯特林数) 题目就是要我们求一个式子(听说叫做超几何分布?好牛逼的名字啊) \[ \sum_{i=1}^{S}\dfrac 1 {N \choose n_i ...
- [LGP2791] 幼儿园篮球题
你猜猜题怎么出出来的? 显然第\(i\)场的答案为 \[ \frac{1}{\binom{n_i}{m_i}\binom{n_i}{k_i}}\sum_{x=0}^{k_i}\binom{n_i}{m ...
- luogu P2791 幼儿园篮球题
传送门 先看我们要求的是什么,要求的期望就是总权值/总方案,总权值可以枚举进球的个数\(i\),然后就应该是\(\sum_{i=0}^{k} \binom{m}{i}\binom{n-m}{k-i}i ...
- 洛谷 P2791 - 幼儿园篮球题(第二类斯特林数)
题面传送门 首先写出式子: \[ans=\sum\limits_{i=0}^m\dbinom{m}{i}\dbinom{n-m}{k-i}·i^L \] 看到后面有个幂,我们看它不爽,因此考虑将其拆开 ...
- 【洛谷2791】 幼儿园篮球题 第二类斯特林数+NTT
求 \(\sum_{i=0}^{k}\binom{m}{i}\binom{n-m}{k-i}i^L\) \((1\leqslant n,m\leqslant 2\times 10^7,1\leqsla ...
- Luogu2791 幼儿园篮球题【斯特林数,数学】
题目链接:洛谷 我一开始不知道$N,M$有什么用处,懵逼了一会儿,结果才发现是输入数据范围... $$\begin{aligned}\binom{n}{k}Ans&=\sum_{i=0}^k\ ...
- RE:ゼロから始める文化課生活
觉得有必要在NOI之前开一篇学习内容记录. 至于为什么要取这个标题呢?也许并没有什么特殊的借口吧. 5.23 在LOJ上搬了三道原题给大家考了考,然后大家都在考试就我一个人在划水. SSerxhs 和 ...
随机推荐
- 转 lsof命令详解
lsof命令详解 lsof (list open files)是一个列出当前系统打开文件的工具.在linux系统环境下,任何事物都可以以文件形式存在,通过文件不仅可以访问常规的数据,还可以访问网络 ...
- 安装vue开发环境→安装淘宝镜像的时候报错
问题: npm WARN deprecated socks@1.1.10: If using 2.x branch, please upgrade to at least 2.1.6 to avoid ...
- C++中的临时对象
1,临时对象神秘在于不知不觉就请入程序当中,并且给程序带来了一定的问题: 2,下面的程序输出什么?为什么? #include <stdio.h> class Test { int mi; ...
- python学习第三天-元组、列表及字典
元组 # 元组() 关键字:tuple# 元组的值一旦确定,不可更改,包括增.删.改都不行# 1.元组只有一个数据时,加逗号在后面,不然就不是元组类型的数据tuple_1 = ("hello ...
- matplotlib系列——中文显示
幕布视图:https://mubu.com/doc/alG8r_3iSw 参考文献:嵩天的Python课程讲义 方式一: 示例 rcParams的属性 方式二:(推荐使用) 示例: 中文字体种类
- 错误提示:Wrong Local header signature: 0xE011CFD0
导入Excel时出现错误,错误提示:Wrong Local header signature: 0xE011CFD0,这个是excel的扩展名问题,.xlsx 应该XSSFWorkbook work ...
- HTML 使用CSS 如何去掉文本聚焦框 HTML 使用CSS 如何去掉文本聚焦框 : outline 值设为none 修改input、textarea输入框placeholder样式
HTML 使用CSS 如何去掉文本聚焦框 : outline 值设为none 修改input.textarea输入框placeholder样式 兼容性代码: input::-webkit-input ...
- Win7装VS2015报错"安装包丢失或损坏"的解决办法
在Win7上安装VS2015的过程中,可能会出现下图错误: 这种情况,多半是应为Win7里面缺少了两个证书: Microsoft Root Certificate Authority 2010 Mic ...
- Codeforces 1188D Make Equal DP
题意:给你个序列,你可以给某个数加上2的幂次,问最少多少次可以让所有的数相等. 思路(官方题解):我们先给序列排序,假设bit(c)为c的二进制数中1的个数,假设所有的数最后都成为了x, 显然x &g ...
- eclipse maven install后查看报错信息