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

Educational Codeforces Round 189 (Rated for Div. 2) F. String Cutting

构建后缀数组,然后从大到小遍历后缀,选取最优子串即可。

注意单独判断一个点:如果候选的子串的lcp与已选的相同,注意要选取总长度更长的那个子串。

这个题是一个不错的SA练习题。

AC代码如下:(分享一个不错的SA板子)

#include<bits/stdc++.h> using namespace std; struct SA{ int n; string s; vector<int>sa,rk,ht,lg; vector<vector<int>>st; void build(const string &_s){ s=_s;n=s.size(); sa.assign(n,0);rk.assign(n,0);ht.assign(n,0); vector<int>x(n),y(n),c(max(256,n)+5,0); int m=256; for(int i=0;i<n;i++)x[i]=(unsigned char)s[i]; for(int i=0;i<n;i++)c[x[i]]++; for(int i=1;i<m;i++)c[i]+=c[i-1]; for(int i=n-1;i>=0;i--)sa[--c[x[i]]]=i; for(int k=1,p;k<n;k<<=1,m=p){ p=0; for(int i=n-k;i<n;i++)y[p++]=i; for(int i=0;i<n;i++)if(sa[i]>=k)y[p++]=sa[i]-k; fill(c.begin(),c.begin()+m,0); for(int i=0;i<n;i++)c[x[y[i]]]++; for(int i=1;i<m;i++)c[i]+=c[i-1]; for(int i=n-1;i>=0;i--)sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1;x[sa[0]]=0; for(int i=1;i<n;i++){ int a=sa[i-1],b=sa[i]; int a1=y[a],b1=y[b]; int a2=a+k<n?y[a+k]:-1; int b2=b+k<n?y[b+k]:-1; if(a1==b1&&a2==b2)x[b]=p-1; else x[b]=p++; } if(p>=n)break; } for(int i=0;i<n;i++)rk[sa[i]]=i; for(int i=0,k=0;i<n;i++){ if(rk[i]==0){k=0;continue;} int j=sa[rk[i]-1]; while(i+k<n&&j+k<n&&s[i+k]==s[j+k])k++; ht[rk[i]]=k; if(k)k--; } lg.assign(n+1,0); for(int i=2;i<=n;i++)lg[i]=lg[i>>1]+1; int K=lg[n]+1; st.assign(K,vector<int>(n,0)); st[0]=ht; for(int j=1;j<K;j++){ int len=1<<j,half=len>>1; for(int i=0;i+len<=n;i++){ st[j][i]=min(st[j-1][i],st[j-1][i+half]); } } } int lcp(int a,int b){ if(a==b)return n-a; int l=rk[a],r=rk[b]; if(l>r)swap(l,r); l++; int len=r-l+1,k=lg[len]; return min(st[k][l],st[k][r-(1<<k)+1]); } int cmp(int a,int b,int c,int d){ int x=b-a+1,y=d-c+1; int z=lcp(a,c); z=min(z,min(x,y)); if(z==min(x,y)){ if(x==y)return 0; return x<y?-1:1; } return s[a+z]<s[c+z]?-1:1; } }; int T,n,l,k,i,j,res,L,R,ll,rr; string s; SA a; signed main(){ ios::sync_with_stdio(false);cin.tie(0); cin>>T; while(T--){ cin>>n>>l>>k; cin>>s; if((long long)n-(long long)l*k<0){cout<<"NO"<<'\n';continue;} res=n-l*k; cout<<"YES"<<'\n'; if(k==1){cout<<s<<'\n';continue;} a.build(s);L=-1; for(i=a.n-1;i>=0;i--){ j=a.sa[i]; if(j==0){ if(L<0){ L=j;R=j+res+l; } else{ ll=j;rr=j+res+l; int len=a.lcp(ll,L); if(len>R-L+1)len=R-L; if(R-L==len&&rr-ll>len){ L=ll;R=rr; } } } else if(j<l)continue; else{ if(j%l<=res&&j+l<=a.n){ if(L<0){ L=j; R=min(a.n,j+(res-j%l)+l); } else{ ll=j; rr=min(a.n,j+(res-j%l)+l); int len=a.lcp(ll,L); if(len>R-L+1)len=R-L; if(R-L==len&&rr-ll>len){ L=ll;R=rr; } } } } } for(i=L;i<R;i++)cout<<s[i];cout<<'\n'; } return 0; }
http://www.jsqmd.com/news/800731/

相关文章:

  • RTOS抢占式调度原理与工程实践指南
  • 澎湃 OS4 底层重构!小米正式告别 MIUI
  • Affect Pulse AI:为AI助手注入轻量级情感交互层的实践指南
  • AI 技术日报 - 2026-05-12
  • Murata村田FB磁珠原厂原装一级代理商分销经销批发
  • 基于CLIP的本地化AI图像标注工具:原理、部署与优化实践
  • LazyAgent框架解析:快速构建AI智能体的开发实践
  • 国内可水洗蜡笔品牌哪家质量好?实测核心维度对比 - 得赢
  • 从ARIMA差分到神经网络:手把手教你用MIM网络搞定时空序列预测中的‘非平稳’难题
  • TalonOS与claw-extensions:构建AI智能体自主协作的认知框架与插件生态
  • 2026年4月可靠的活性炭吸附供应厂家推荐,催化燃烧RTO/RCO装置/湿式打磨台,活性炭吸附生产厂家怎么选择 - 品牌推荐师
  • QINGDA清达原厂原装一级代理商分销经销渠道
  • @valid和@Validated的区别是什么?
  • [BUUCTF]内涵的软件
  • 基于MCP协议的AI智能体如何自动化CRM数据管理与广告投放
  • VLA技术研究
  • Perplexity接入ScienceDirect文献库全链路解析(2024科研人必抢的AI学术入口)
  • 前端周报:Remix 3、Node 26 与 Chrome 148
  • Linux 性能分析工具 sar 历史数据缺失如何配置 sysstat 服务?
  • 别再死记硬背公式了!用Python动画可视化tf.nn.depth_to_space的完整数据搬运过程
  • 基于语义的会话搜索:从向量化到工程实践
  • 硬核干货!从RAG到多模态RAG:核心知识、架构Checklist与避坑实战指南
  • Unity手游资源逆向:从APK到Assembly-CSharp的提取与解析
  • 别再傻傻用matlab求逆了!用追赶法高效求解三对角矩阵(附MATLAB代码)
  • Terafab芯片项目正式启动;三星加速P5工厂建设1c纳米工艺支撑HBM4量产;香港科技大学研发的220磅月球建筑机器人正式亮相
  • 【2025最新】基于SpringBoot+Vue的夕阳红公寓管理系统管理系统源码+MyBatis+MySQL
  • 2026年最值得做的AI副业:普通人如何利用AI建立持续收入
  • WASM学习笔记
  • Verilog与SystemVerilog在Cycle Model Compiler中的核心支持解析
  • 没有工作经验,他半月拿下算法岗位