正题

题目链接:https://www.luogu.com.cn/problem/P5341


题目大意

给出一个字符串,求出现次数恰好为kkk的子串中,出现最多的长度。


解题思路

先根据TTT构建一个SAMSAMSAM,对于一个endposendposendpos类中,所有出现串的长度一定是一个连续的区间。
所以我们直接计算出每个endposendposendpos类的大小,如果是kkk,就差分让[lenfx+1,lenx][len_{f_x}+1,len_{x}][lenfx​​+1,lenx​]加111。

时间复杂度O(n)O(n)O(n)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2e5+10;
ll T,n,k,a[N],c[N],rk[N],num[N];
ll cnt,last,fa[N],ch[N][26],len[N];
char s[N];
void insert(ll c){ll p=last,np=last=++cnt;len[np]=len[p]+1;num[cnt]++;for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;if(!p)fa[np]=1; else{ll q=ch[p][c];if(len[p]+1==len[q])fa[np]=q;else{ll nq=++cnt;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[nq]));fa[nq]=fa[q];fa[q]=fa[np]=nq;for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;}}return;
}
int main()
{scanf("%lld",&T);while(T--){last=cnt=1;memset(ch[1],0,sizeof(ch[1]));scanf("%s",s+1);n=strlen(s+1);for(ll i=1;i<=n;i++)insert(s[i]-'a'),a[i]=c[i]=0;scanf("%lld",&k);bool flag=0;for(ll i=1;i<=cnt;i++)c[len[i]]++;for(ll i=1;i<=n;i++)c[i]+=c[i-1];for(ll i=1;i<=cnt;i++)rk[c[len[i]]--]=i;for(ll i=cnt;i>=1;i--)num[fa[rk[i]]]+=num[rk[i]];for(ll i=2;i<=cnt;i++)if(num[i]==k)a[len[i]]++,a[len[fa[i]]]--,flag=1;for(ll i=n;i>=0;i--)a[i]+=a[i+1];ll mark=0;a[0]=0;for(ll i=1;i<=n;i++)if(a[i]>=a[mark])mark=i;if(!flag)printf("-1\n");else printf("%lld\n",mark);for(ll i=0;i<=cnt;i++)num[i]=fa[i]=len[i]=0,memset(ch[i],0,sizeof(ch[i]));}
}

P5341-[TJOI2019]甲苯先生和大中锋的字符串【SAM】相关推荐

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

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

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

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

  3. [TJOI2019]甲苯先生的滚榜——非旋转treap

    题目链接: [TJOI2019]甲苯先生的滚榜 要求维护一个二维权值的集合并支持单点修改,用平衡树维护即可. 因为$n\le 10^6$但$m\le 10^5$,所以最多只有$10^5$个人被操作. ...

  4. redis:redis介绍和安装、普通连接和连接池、redis 5大数据类型之字符串、Hash、列表、其他操作(通用)、管道、django使用redis、接口缓存

    目录 一. redis介绍和安装 二. 普通连接和连接池 三. redis 5大数据类型之字符串 四. redis 5大数据类型之Hash 五. redis 5大数据类型之列表 六. 其他操作(通用) ...

  5. JAVA中如何将大数字或字符串放进数组

    JAVA中如何将大数字或字符串放进数组 在JAVA学习过程中字符串.数组.数字之间的 的转换经常用到,记录一些非常基础的转换. 1.将数字转换为字符串:String str = String.valu ...

  6. [洛谷P5340][TJOI2019]大中锋的游乐场

    题目大意:有$n(n\leqslant10^4)$个点,$m(m\leqslant10^5)$条边的无向图,每个点有一个属性$A/B$,要求$|cnt_A-cnt_B|\leqslant k(k\le ...

  7. luogu P5338 [TJOI2019]甲苯先生的滚榜

    传送门 首先,排名系统,一看就知道是原题,可以上平衡树来维护 然后考虑一种比较朴素的想法,因为我们要知道排名在一个人前面的人数,也就是AC数比他多的人数+AC数一样并且罚时少的人数,所以考虑维护那两个 ...

  8. 【题解】Luogu P5338 [TJOI2019]甲苯先生的滚榜

    原题传送门 这题明显可以平衡树直接大力整,所以我要说一下线段树+树状数组的做法 实际线段树+树状数组的做法也很暴力 我们先用树状数组维护每个ac数量有多少个队伍.这样就能快速求出有多少队伍ac数比现在 ...

  9. c语言中怎样变大输出的字符串,C语言。要输入一个超大数比如 111111111111111111111111111111111111111 怎样用字符串数组求各位的和呢?...

    满意答案 muwen3798 2014.01.04 采纳率:45%    等级:13 已帮助:9415人 这个超大数不是10的100次方个数,而是一个数,只不过有100位,那么我们会用一个整型的数据存 ...

最新文章

  1. Spring基础专题——第三章(反转控制与依赖注入)
  2. 例题6-6 小球下落(Dropping Balls, UVa 679)
  3. 洛谷 P1821 [USACO07FEB]银牛派对Silver Cow Party
  4. 序列化技术的选型-选型建议
  5. SpringCloud个人笔记-02-Feign初体验
  6. 如何安装mysql 5.6_如何安装MySQL 5.6?
  7. 【资源挖掘】免费DEM数据下载
  8. VS编译器常见的问题
  9. BC95-G NB-IOT 模块使用
  10. 答题活动助手小程序更新记录
  11. 安利一款提醒休息的工具--重度电脑工作者和程序员必备
  12. 社区实践 | Kube-OVN实现K8s多租户网络管理
  13. 写个数仓吧(15)品牌复购率——ADS层
  14. 0918 iOS10兼容/iOS系统过高或过低配置包/混合引擎的在线视频连麦互动直播/源码管理工具/Xcode8插件升级/导航栏渐变
  15. 图像边缘检测与图像梯度的概念
  16. 深入浅出OOD(一)
  17. 2022年全国职业院校技能大赛(中职组)网络安全竞赛试题
  18. cocos2d-LUA逆向之修改客户端app,实时获取app解密后通信数据
  19. Windows与网络基础-19注册表维护与优化
  20. 珐琅彩瓷:是如何涨到天价的

热门文章

  1. 安装mysql二进制文件_MySQL二进制文件规范安装
  2. 怎么用计算机计算出选手最后得分,WPS技巧:TRIMMEAN函数计算选手得分
  3. 3 src 获取_CVE-2019-15846:Exim远程获取root权限漏洞分析
  4. vscode 快速调到定义处_vim技巧:在程序代码中快速跳转,在文件内跳转到变量定义处...
  5. 经纬度 c代码中定义_如何将TXT文本格式的批量经纬度值导入到奥维成为标签
  6. 7-5 流水作业调度 (10 分)(思路+详解+johnson解析)Come Baby!!!!!!!!!!
  7. [SpringSecurity]web权限方案_CSRF功能
  8. C++string容器-子串获取
  9. 唯品会php接口,唯品会链接生成联盟链接 - 唯品会API免费API接口-唯品会API开放API接口-云商数据(www.ecapi.cn)...
  10. word List 17