有个叫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. ArcGIS JS 之通过代理配置ArcGIS Server服务 token

    ArcGIS JS 代理 1.ArcGIS Server Manager中配置访问服务的用户名.密码.角色等,并配置地图服务的具体角色名称 2.在ArcGIS JS中配置使用代理,下述代码将esri的 ...

  2. mysql 字符

    只适用mysql5.0以上的版本: 1.一个汉字占多少长度与编码有关:         UTF-8:一个汉字=3个字节            GBK:一个汉字=2个字节 2.varchar(n)表示n ...

  3. [高清·非影印]Spring实战+SpringBoot实战+Spring微服务实战+SpringCloud微服务实战(全4本)

    ------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...

  4. new Image 读取宽高为0——onload

    获取图片一张图片的大小 let img = new Image() img.src = imgUrl if ( img.width != 375 || img.height != 200 ) { me ...

  5. Python之TensorFlow的卷积神经网络-5

    一.卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度 ...

  6. Flutter裁剪图片

    最近在学习中需要用到裁剪图片,记录一下解决方法 思路: 使用canvas的drawImageRect()方法,对Image进行裁剪,这里的Image需要 'dart:ui' 库中的Image. 1. ...

  7. rabbitmq保证数据不丢失方案

    rabbitmq如何保证消息的可靠性 1.保证消息不丢失 1.1.开启事务(不推荐) 1.2.开启confirm(推荐) 1.3.开启RabbitMQ的持久化(交换机.队列.消息) 1.4.关闭Rab ...

  8. cocoaPods升级遇到的问题 升级ruby 升级cocoaPos

    最近重复了一次,修复一些更改. 1.查询 rvm版本rvm -v 2.查询ruby版本ruby -v 3.查询 gem 版本gem -v 4.查询ruby 镜像gem sources -l 5.升级r ...

  9. iOS数组遍历

    对于一个数组 NSArray *array = @[@"111",@"222",@"333",@"444",@" ...

  10. 在Xcode4 中将iPhone使用的xib转换成iPad使用的xib

    来源:http://blog.3snews.net/space.php?uid=6188&do=blog&id=64200 http://www.giser.net/?p=982 1 ...