[TJOI2019]甲苯先生和大中锋的字符串
有个叫asuldb的神仙来嘲讽我
说这题SAM水题,而且SA过不了
然后我就用SA过了
显然是一个Height数组上长为k的滑块,判一下两边,差分一下就可以了
#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"
using namespace std;
const int MAXN=1e5+5;
int n,T,mx,hd,tl;
char ch[MAXN];
int id[MAXN],rnk[MAXN],SA[MAXN],bnk[MAXN],Ht[MAXN];
int cnt[MAXN],q[MAXN];
int read()
{
int x=0;char ch=getchar();
while(ch<'0'||'9'<ch) ch=getchar();
while('0'<=ch&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x;
}
void shel()
{
for(int i=1;i<=n;++i) ++bnk[rnk[i]];
for(int i=1;i<=mx;++i) bnk[i]+=bnk[i-1];
for(int i=1;i<=n;++i) SA[++bnk[rnk[id[i]]-1]]=id[i];
for(int i=0;i<=mx;++i) bnk[i]=0;
}
void GetSA()
{
mx=0;
for(int i=1;i<=n;++i) id[i]=i,rnk[i]=ch[i],mx=mx<rnk[i]?rnk[i]:mx;
shel();
for(int k=1;k<n;k<<=1){
for(int i=1;i<=k;++i) id[i]=n-k+i;
int ct=k;
for(int i=1;i<=n;++i) if(SA[i]>k) id[++ct]=SA[i]-k;
shel();swap(rnk,id);rnk[SA[1]]=1;
for(int i=2;i<=n;++i){
if(id[SA[i]]==id[SA[i-1]]&&id[SA[i]+k]==id[SA[i-1]+k]) rnk[SA[i]]=rnk[SA[i-1]];
else rnk[SA[i]]=rnk[SA[i-1]]+1;
}if(rnk[SA[n]]==n) break;
mx=rnk[SA[n]];
}return;
}
void GetHt()
{
int k=0;
for(int i=1;i<=n;++i){
if(rnk[i]==1) continue;
int tmp=SA[rnk[i]-1];
k=k?k-1:0;
while(tmp+k<=n&&i+k<=n&&ch[i+k]==ch[tmp+k]) ++k;
Ht[rnk[i]]=k;
}return;
}
int GetLCP(int x,int y)
{
if(x>y) return n-SA[y]+1;
return Ht[q[hd]];
}
int main()
{
T=read();
while(T--){
memset(id,0,sizeof(id));
memset(cnt,0,sizeof(cnt));
scanf("%s",ch+1);n=strlen(ch+1);
int w;scanf("%d",&w);Ht[n+1]=0;
GetSA(),GetHt();hd=1;tl=0;
for(int i=2;i<=w;++i){
while(hd<=tl&&Ht[q[tl]]>=Ht[i]) --tl;
q[++tl]=i;
}for(int i=w;i<=n;++i){
if(i-q[hd]+1>=w) ++hd;
while(hd<=tl&&Ht[q[tl]]>=Ht[i]) --tl;
q[++tl]=i;
int tmp=GetLCP(i+1,i+w-1);
int g=max(Ht[i-w+1],Ht[i+1]);
if(g<=tmp) ++cnt[g+1],--cnt[tmp+1];
}int tmp=-1,mm=1;
for(int i=1;i<=n;++i){
cnt[i]+=cnt[i-1];
if(cnt[i]>=mm) mm=cnt[i],tmp=i;
}printf("%d\n",tmp);
}return 0;
}
[TJOI2019]甲苯先生和大中锋的字符串的更多相关文章
- [TJOI2019]甲苯先生和大中锋的字符串——后缀自动机+差分
题目链接: [TJOI2019]甲苯先生和大中锋的字符串 对原串建后缀自动机并维护$parent$树上每个点的子树大小,显然子树大小为$k$的节点所代表的子串出现过$k$次,那么我们需要将$[len[ ...
- 洛谷P5341 [TJOI2019]甲苯先生和大中锋的字符串
原题链接P5341 [TJOI2019]甲苯先生和大中锋的字符串 题目描述 大中锋有一个长度为 n 的字符串,他只知道其中的一个子串是祖上传下来的宝藏的密码.但是由于字符串很长,大中锋很难将这些子串一 ...
- Tjoi2019 甲苯先生和大中锋的字符串 后缀自动机_差分
tjoi胆子好大,直接出了两道送分题...... 都 9102 年了,还有省选出模板题QAQ...... Code: #include <bits/stdc++.h> #define se ...
- 【题解】Luogu P5341 [TJOI2019]甲苯先生和大中锋的字符串
原题传送门 实际按照题意模拟就行 我们先求出字符串的sa 因为要在字符串中出现k次,所以我们枚举\(l,r(r-l+1=k)\)看一共有多少种合法的方案 合法方案的长度下界\(lb\)为\(Max(h ...
- 【洛谷 P5341】 [TJOI2019]甲苯先生和大中锋的字符串(后缀自动机)
题目链接 建出\(sam\),求出parent tree上每个点的\(endpos\)集合大小. 如果等于\(k\),说明到达这个点的都可以.给\((len[fa(i)],len[i]]\)的\(cn ...
- luogu P5341 [TJOI2019]甲苯先生和大中锋的字符串
传送门 考虑子串以及出现个数,可以发现SAM可以快速知道每种子串的出现次数,即所在状态的\(endpos\)集合大小,然后一个状态对应的子串长度是一段连续区间,所以可以对每个状态差分一下,就能统计答案 ...
- p5341 [TJOI2019]甲苯先生和大中锋的字符串
分析 TJOI白给题 建出sam,对于每个点如果它的子树siz和等于k 那么对于这个满足的点它有贡献的长度一定是一个连续区间 直接差分即可 代码 #include<bits/stdc++.h&g ...
- [TJOI2019]大中锋的游乐场——最短路+DP
题目链接: [TJOI2019]大中锋的游乐场 题目本质要求的还是最短路,但因为有第二维权值(汽水看成$+1$,汉堡看成$-1$)的限制,我们在最短路的基础上加上一维$f[i][j]$表示到达$i$节 ...
- [TJOI2019]甲苯先生的字符串——矩阵乘法+递推
题目链接: [TJOI2019]甲苯先生的字符串 我们用一个$26*26$的$01$矩阵记录任意两个字符是否能相邻. 设$f[i][j]$表示处理完前$i$个字符,第$i$个字符为$j$的方案数. 可 ...
随机推荐
- 使用QMetaObject获取类的属性
const QMetaObject *metaobject = object->metaObject(); int count = metaobject->propertyCount(); ...
- mybatis-plus代码生成,实体类不生成父类属性
一.参考文档: 官方文档其实说的很清楚了,可能有个别地方有点不太清楚. mybatis-plus官方: https://mp.baomidou.com/guide/generator.html 模版引 ...
- 全面学习 Python 包:包的构建与分发
首发于公众号:Python编程时光 1. 为什么需要对项目分发打包? 平常我们习惯了使用 pip 来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而 ...
- 启动Nginx服务失败:Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
首次接触nginx,安装完使用命令 service nignx restart 后,出现这个错误,并按照提示给出的命令查看错误详情 systemctl status nginx.service ...
- HTML学习摘要5
DAY 5 HTML <address> 元素定义文档或文章的联系信息(作者/拥有者). 此元素通常以斜体显示.大多数浏览器会在此元素前后添加折行. HTML <cite> 元 ...
- C++中头文件与源文件的作用详解
一.C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件―― .cpp 文件和 .h 文件.其中,.cpp 文件被称作 C++ 源文件,里面放的都是 C++ 的源代码:而 .h 文件则被称作 ...
- NSLog的各种打印格式符和打印CGRect相关结构体
1.打印CG开头的数据类型,如CGRect,CGSize等方法 1.1 打印CGRect : NSLog(@"%@", NSStringFromCGRect(someCGRect) ...
- 判断是否发生url跳转
url="https://www.baidu.com/" url='http://www.freebuf.com/fevents/133225.html' # 方法一:禁止跳转:a ...
- 【hive】centos7下apache-hive-3.1.2-bin的安装测试
前言:安装hive还是遇见些问题,但还好都解决了,比当初安装配置hadoop-3.2.0容易点...... 正文: 1.下载并安装hive:tar -zxvf apache-hive-3.1.2-bi ...
- tp5 修改配置参数 view_replace_str 无效
原因: 缓存问题 找到 thinkphp\library\think\Template.php 找到 public function fetch($template, $vars = [], $c ...