对于答案来说,一定是

  1. 前 i-1 个字符和 t的前 i 个一样,然后第 i 个字符比 t的 大 \(i\in [1,m]\)
  2. 前缀为t,然后长度比t长

对于第一种情况,枚举这个 i ,然后找最小的 p 可以使得从\(s[1\sim p]\) 中产生\(t_1t_2\cdots t_{i-1}\) ,然后在\(s[p+1,n]\)中找最左边的比\(t[i]\) 大的字符,假如 找到了\(s[pos]\),那么后面的\(s[pos+1,n]\) 都可以加到答案后面(因为\(s[pos] > t[i]\) 已经保证答案大于t了)

对于第二种,根据求第一种的方法,不难求出

如何找最小的p?预处理一个\(sf[i][c]\) 数组,表示\(s[i]\) 后面第一个字符\(c\)在哪里即可

如何找pos? 也是用预处理的数组循环最多26次即可

复杂度\(O(n*26)\)

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int sf[N][26]; char s[N],t[N]; int n,m;
int main(){
scanf("%d%d",&n,&m);
scanf("%s%s",s+1,t+1);
for(int i=0;i<26;i++)sf[n][i] = n+1; for(int i=n-1;i>=0;i--){
memcpy(sf[i],sf[i+1],sizeof sf[i]);
sf[i][s[i+1]-'a'] = i+1;
} int p = 0,res = -1;
for(int i=1;i<=m;i++){
int pos = n+1;
for(int j=t[i]-'a'+1;j<26;j++){
pos = min(pos,sf[p][j]);//找到最近的那个s[pos] > t[i];
}
if(pos != n+1)
res = max(res,i+n-pos);//(n-pos)为后面还可以加的长度
p = sf[p][t[i]-'a'];
if(p == n+1)break;
}
if(p < n)
res = max(res,n-p+m);
printf("%d\n",res);
return 0;
}

最新文章

  1. dedecms 相关文章likearticle
  2. Python之路 day3 高阶函数
  3. 入侵本地Mac OS X的详细过程 转自https://yq.aliyun.com/articles/22459?spm=5176.100239.blogcont24250.10.CfBYE9
  4. 浅谈Excel开发:四 Excel 自定义函数
  5. 【代码笔记】iOS-旋转的图片
  6. 如何通过CRM评估客户价值和提高客户忠诚度?
  7. 2015弱校联盟(1) -A. Easy Math
  8. cocos2dx+lua注册事件函数详解
  9. .NET 代码编译过程
  10. CentOS 6.6 nginx PHP 配置
  11. R简易入门(二)
  12. DelphiXE8新建AVD
  13. POJ 3096 Surprising Strings(STL map string set vector)
  14. Java入门-浅析Java学习从入门到精通【转】
  15. Spark如何解决常见的Top N问题
  16. 调试makefile—subst函数
  17. 去除测序reads中的接头:adaptor
  18. NodeJS基础总结(一)
  19. 【Mybatis】MyBatis之动态SQL(六)
  20. python 08

热门文章

  1. fastjsion反序列化漏洞渗透测试笔记
  2. laravel5.4 接入qq第三方登录
  3. LeetCode278 第一个错误的版本
  4. Azure Terraform(四)状态文件存储
  5. 【UML】基本介绍与类图(依赖、泛化、实现、关联、聚合、组合关系)
  6. BAPI创建PO,禁止净价信息更新
  7. Spring Aop中四个重要概念,切点,切面,连接点,通知
  8. MYSQL(将数据加载到表中)
  9. Oracle数据库启动和关闭
  10. Docker容器日志清理方案