有个叫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]甲苯先生和大中锋的字符串的更多相关文章

  1. [TJOI2019]甲苯先生和大中锋的字符串——后缀自动机+差分

    题目链接: [TJOI2019]甲苯先生和大中锋的字符串 对原串建后缀自动机并维护$parent$树上每个点的子树大小,显然子树大小为$k$的节点所代表的子串出现过$k$次,那么我们需要将$[len[ ...

  2. 洛谷P5341 [TJOI2019]甲苯先生和大中锋的字符串

    原题链接P5341 [TJOI2019]甲苯先生和大中锋的字符串 题目描述 大中锋有一个长度为 n 的字符串,他只知道其中的一个子串是祖上传下来的宝藏的密码.但是由于字符串很长,大中锋很难将这些子串一 ...

  3. Tjoi2019 甲苯先生和大中锋的字符串 后缀自动机_差分

    tjoi胆子好大,直接出了两道送分题...... 都 9102 年了,还有省选出模板题QAQ...... Code: #include <bits/stdc++.h> #define se ...

  4. 【题解】Luogu P5341 [TJOI2019]甲苯先生和大中锋的字符串

    原题传送门 实际按照题意模拟就行 我们先求出字符串的sa 因为要在字符串中出现k次,所以我们枚举\(l,r(r-l+1=k)\)看一共有多少种合法的方案 合法方案的长度下界\(lb\)为\(Max(h ...

  5. 【洛谷 P5341】 [TJOI2019]甲苯先生和大中锋的字符串(后缀自动机)

    题目链接 建出\(sam\),求出parent tree上每个点的\(endpos\)集合大小. 如果等于\(k\),说明到达这个点的都可以.给\((len[fa(i)],len[i]]\)的\(cn ...

  6. luogu P5341 [TJOI2019]甲苯先生和大中锋的字符串

    传送门 考虑子串以及出现个数,可以发现SAM可以快速知道每种子串的出现次数,即所在状态的\(endpos\)集合大小,然后一个状态对应的子串长度是一段连续区间,所以可以对每个状态差分一下,就能统计答案 ...

  7. p5341 [TJOI2019]甲苯先生和大中锋的字符串

    分析 TJOI白给题 建出sam,对于每个点如果它的子树siz和等于k 那么对于这个满足的点它有贡献的长度一定是一个连续区间 直接差分即可 代码 #include<bits/stdc++.h&g ...

  8. [TJOI2019]大中锋的游乐场——最短路+DP

    题目链接: [TJOI2019]大中锋的游乐场 题目本质要求的还是最短路,但因为有第二维权值(汽水看成$+1$,汉堡看成$-1$)的限制,我们在最短路的基础上加上一维$f[i][j]$表示到达$i$节 ...

  9. [TJOI2019]甲苯先生的字符串——矩阵乘法+递推

    题目链接: [TJOI2019]甲苯先生的字符串 我们用一个$26*26$的$01$矩阵记录任意两个字符是否能相邻. 设$f[i][j]$表示处理完前$i$个字符,第$i$个字符为$j$的方案数. 可 ...

随机推荐

  1. Jenkins + GitLab + SpringBoot 实现持续集成脚本

    Linux脚本 #!/bin/bash jar_name=hq-api.jar cd /usr/local/app/hq-api echo "Stopping SpringBoot Appl ...

  2. Java内存模型——方法区

    方法区(Method Area) ①      对每个加载的类型,JVM必须在方法区中存储以下类信息: 1)        这个类型的完整有效名(类型信息) 类型名称在Java类文件和JVM中都以完整 ...

  3. cefsharp System.IO.FileNotFoundException: 未能加载文件或程序集“CefSharp.Core.dll”或它的某一个依赖项。

    解决办法 安装vc++ 2015 Redistributable 64位系统安装x64 如果还报错先装x64版本再装x86版本 https://files.cnblogs.com/files/xuej ...

  4. Python3 MySQL

    首先安装pymysql  pip install pymysql 准备数据库:创建一个数据库testdb mysql实例: import pymysql #打开数据库连接,使用数据库所在的IP127. ...

  5. 刚接触HTML5应该先学哪里才好?

    好吧,话不多说,直接来点干货吧! 刚接触html的小白都感觉摸不着头脑?应该怎么学习呢,其实HTML5可能对于还没有接触过的小白来说会比较的难,听起来也比较新颖.这是个什么骚东西!其实不然,这个就是构 ...

  6. vue2.0项目在360兼容模式下打开空白

    安装两个依赖环境 yarn add babel-polyfill -D yarn add babel-preset-es2015 babel-cli -D 在main.js中引入babel-polyf ...

  7. angular解决跨域问题

    通过angular自身的代理转发功能 配置package.json  启动项目通过npm start启动,会自动启动代理服务npm start

  8. MySQL Replication--开启GTID模式下匿名事务异常

    错误环境: OS: CentOS release 6.5 (Final) MySQL: MySQL 5.7.19 主从参数配置: master_info_repository = TABLE rela ...

  9. 【DRF框架】REST风格

    REST风格 表述性状态转移——web交互方案 目的 解决前后端交互的问题,开发效率高,简介,性能好 定义 资源:网上的所有信息或者很抽象的概念,在web中只要又被引用的必要都是资源 URI:统一资源 ...

  10. python两则99乘法表

    分别应用while和for的嵌套循环,适用于初学的人看看 x = 1 while x <= 9: y = 1 while y <= x: print (y,'*',x,'=',x*y,en ...