当前位置: 首页 > news >正文

不是烤串故事【牛客tracker 每日一题】

不是烤串故事

时间限制:2秒 空间限制:512M

网页链接

牛客tracker

牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每日有题做,丰盈牛币日益多!

题目描述

小红有两个长度为n nn的字符串s sst tt,我们定义下标从1 11开始,现在你可以选取字符串s ss的前i ii个字符s 1 s 2 ⋯ s i s_1s_2⋯s_is1s2si,然后将这一部分反转后与剩余部分拼接,得到s i ′ s_i^′si

请你找到每一个翻转前缀s i ′ s_i^′si与字符串t ttm a x ⁡ _ l e n i = 1 n { l c p ( s i ′ , t ) } max⁡\_len_{i=1}^n\{lcp(s_i^′,t)\}max⁡_leni=1n{lcp(si,t)},即长度最长的l c p ( s i ′ , t ) lcp(s_i^′,t)lcp(si,t)。在这里,l c p lcplcp代表最长公共前缀。

好吧,这其实并不难,作为神秘的F FF题,你同时需要输出满足上述条件的最小的i ii

在本题中,反转即为将字符串绕中心字符前后反转,具体地说,设字符串为s 1 s 2 ⋯ s n − 1 s n s_1s_2⋯s_{n−1}s_ns1s2sn1sn,反转后得到s n s n − 1 ⋯ s 2 s 1 s_ns_{n−1}⋯s_2s_1snsn1s2s1

输入描述:

每个测试文件均包含多组测试数据。第一行输入一个整数T ( 1 ≤ T ≤ 100 ) T (1≤T≤100)T(1T100)代表数据组数,每组测试数据描述如下:
第一行输入一个整数n ( 1 ≤ n ≤ 10 6 ) n(1≤n≤10^6)n(1n106)代表字符串长度。
第二行输入一个长度为n nn,且仅由小写字母构成的字符串s ss
第三行输入一个长度为n nn,且仅由小写字母构成的字符串t tt

除此之外,保证所有的n nn之和不超过10 6 10^6106

输出描述:

对于每一组测试数据,在一行上输出两个整数,代表最长l c p lcplcp长度和在此条件下最小的i ii

示例1

输入:

3 6 baabaa aabbbb 3 abc bac 2 ab cd

输出:

4 3 3 2 0 1

说明:

对于第一组测试数据,我们这样描述整个过程:

解题思路

本题核心是通过KMP算法+预处理数组高效计算每个翻转前缀对应的最长公共前缀( l c p ) (lcp)lcp:首先预处理suc数组,记录从位置i开始s与t的连续匹配长度(未翻转部分);利用K M P KMPKMP算法对反转的s前缀与t做匹配,生成pre数组,记录每个翻转前缀长度i对应的匹配长度;遍历每个i ii时,若翻转前缀匹配长度≥ i ≥ii,总l c p lcplcp为匹配长度加suc[i+1](剩余未翻转部分匹配长度),否则为pre[i];最后维护最大l c p lcplcp值及对应的最小i ii。该方法通过K M P KMPKMP将字符串匹配复杂度降至O ( n ) O(n)O(n),每组数据总时间复杂度O ( n ) O(n)O(n),适配总n ≤ 1 e 6 n≤1e6n1e6的规模,精准计算每个i iil c p lcplcp并找到最优解。

总结

  1. 核心逻辑:用K M P KMPKMP预处理翻转前缀与t tt的匹配长度,结合suc数组处理未翻转部分匹配,计算每个i ii对应的总l c p lcplcp
  2. 关键操作:预处理suc数组记录未翻转匹配长度,通过K M P KMPKMP生成pre数组记录翻转前缀匹配长度,遍历i ii计算总l c p lcplcp
  3. 效率保障:K M P KMPKMP算法使字符串匹配线性化,整体时间复杂度O ( n ) O(n)O(n)每组,适配大数据量要求。

代码内容

#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<int>>vt;typedefpair<int,int>pll;constll N=1e6+10;constll mod=1e4+7;constll INF=1e18;chars[N],p[N];intnxt[N],pre[N],suc[N];voidsolve(){memset(pre,0,sizeof(pre));intn;scanf("%d%s%s",&n,s+1,p+1);suc[n+1]=0;for(inti=n;i;i--)suc[i]=s[i]==p[i]?suc[i+1]+1:0;for(inti=2;i<=n;i++){intj=nxt[i-1];while(j&&p[i]!=p[j+1])j=nxt[j];nxt[i]=p[i]==p[j+1]?++j:0;}intcur=0;for(inti=n;i;i--){while(cur&&s[i]!=p[cur+1])cur=nxt[cur];if(s[i]==p[cur+1])++cur,pre[i+cur-1]=max(pre[i+cur-1],cur);if(i==1){intk=cur;while(k){pre[i+k-1]=max(pre[i+k-1],k);k=nxt[k];}}}intlcp=0,pos=1;for(inti=1;i<=n;i++){inttmp=pre[i];if(pre[i]>=i)tmp+=suc[i+1];if(tmp>lcp)lcp=tmp,pos=i;}printf("%d %d\n",lcp,pos);}intmain(){intT;scanf("%d",&T);while(T--)solve();return0;}
http://www.jsqmd.com/news/459328/

相关文章:

  • 探索三相并网逆变器LCL逆变之控制策略与仿真实践
  • AI-Native的定义与特征
  • 华为 MetaERP 的多组织、多帐套、多币种、多会计准则核算架构,核心是元数据驱动 + 云原生微服务 + 实时核算引擎 + 分布式数据底座,实现 “交易即核算、单账套多准则、全球实时合并”
  • MATLAB Simulink 中的 BCH 编码译码:穿越 AWGN 与 BSC 信道之旅
  • 手把手教你用ZYNQ打造一款便携式多通道频谱分析仪
  • 威纶通MT8071iE触摸屏宏指令程序:清晰注释下的开机页面与产量统计功能
  • OpenClaw 本地部署教程(Windows)| GitHub 爆火 AI Agent 框架安装指南
  • Android 蓝牙连接不稳定怎么解决?BLE 稳定性架构设计(上篇)
  • Unity Scroll View内容轮播实现
  • 探索STM32 Modbus RTU 主从机源码及其实践
  • 探索雷塞HBS86H 86闭环电机驱动器方案宝藏
  • 数据库系统工程师-操作系统 I/O 管理:数据库性能优化的底层核心
  • 基于YOLOv8的人脸表情识别系统【附源码】
  • 探索Potrace算法:位图矢量化的奇妙之旅
  • 一个创业老兵关于四个终极问题的二十年纪实
  • HTML_段落与换行
  • 微网综合能源优化调度代码合集:涵盖多种智能算法与实战应用场景
  • 负荷预测:布谷鸟优化的LSTM模型及对比分析
  • LazyCut
  • 在工控项目里最头疼的就是IO状态监控页面制作,每个按钮指示灯都得手动关联变量。上周调试KTP700触摸屏时突然开窍——做个万能IO显示模板不香吗
  • MATLAB P文件转码工具:将P文件转换为M文件
  • 发电机定子回路故障Simulink单相电流纵联差动保护仿真模型及动作电流波形分析
  • 基于FPGA的FIR滤波器设计:从MATLAB参数设计到FPGA实现及验证
  • 鸿蒙中 系统语言和区域的获取与监听
  • 计算机毕业设计springboot单亲家庭帮扶管理系统 基于SpringBoot的单身父母家庭综合支持与服务系统 特殊结构家庭社会救助与资源对接数字化平台
  • Pscad仿真-三机九节点系统,储能替换一台同步机,对比是否加入调频策略 三机系统改成50hz
  • Adobe Photoshop
  • SpringBoot3快速集成SMS4J,10分钟搞定短信+OA双渠道消息发送
  • 02计算机组成原理-流水线冒险(上)
  • 06.Python 中数字:整数、浮点数完全指南