思路 :

先对b 的所有后缀建立trie树

第一问

暴力枚举a串的起点

在trie树上跑 找到最短的

第二问

也是暴力枚举a串的起点

a和b顺着暴力匹配就好

第三问

求出来a在第i个位置 加一个字母j 能够到的最近的位置 f[i][j] 到最后就是inf

从f[0][j]DFS 在trie上跟着跑找到最小的deep更新答案

第四问

先按照求f一样同理求出b串 的  g

dp[i][j]表示a的前i个位置 b不得不匹配到b的第j个位置

            dp[i+1][j]=min(dp[i+1][j],dp[i][j]),
            dp[i+1][g[j][a[i]]]=min(dp[i+1][g[j][a[i]]],dp[i][j]+1);
1—>strlen(a)+1 min dp[i][inf]就是答案
 
这题看起来简单  其实感觉在考场根本写不出来...
 
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=,inf=;
int ch[N*N/][],f[N][],g[N][],dp[N][N],cnt,ans1,ans2,ans3,ans4,vis[];
void insert(char *a){
int now=;
for(int i=;a[i];i++){
if(!ch[now][a[i]])ch[now][a[i]]=++cnt;
now=ch[now][a[i]];
}
}
int solve1(char *a){
int now=,i;
for(i=;a[i];i++){
if(!ch[now][a[i]])return i+;
else now=ch[now][a[i]];
}return inf;
}
void solve3(int x,int now,int deep){
if(x==inf)return;
if(!now&&deep){ans3=min(ans3,deep);return;}
for(int i=;i<=;i++)solve3(f[x][i],ch[now][i],deep+);
}
char a[N],b[N];
int main(){
scanf("%s%s",a+,b+);
int n1=strlen(a+),n2=strlen(b+);
for(int i=;i<=n1;i++)a[i]=a[i]-'a'+;
for(int i=;i<=n2;i++)b[i]=b[i]-'a'+;
for(int i=;i<=n2;i++)insert(b+i);
ans1=ans2=ans3=ans4=inf;
for(int i=;i<=n1;i++)ans1=min(ans1,solve1(a+i));
for(int i=;i<=n1;i++){
int now=;
for(int j=;i+j<=n1;now++,j++){
while(a[i+j]!=b[now]&&now<=n2)now++;
if(now>n2){ans2=min(ans2,j+);break;}
}
}
for(int i=;i<=n1;i++){
memset(vis,,sizeof(vis));
for(int j=i+;j<=n1;j++)if(!vis[a[j]])vis[a[j]]=j;
for(int j=;j<=;j++)f[i][j]=vis[j]?vis[j]:inf;
}solve3(,,);
for(int i=;i<=n2;i++){
memset(vis,,sizeof(vis));
for(int j=i+;j<=n2;j++)if(!vis[b[j]])vis[b[j]]=j;
for(int j=;j<=;j++)g[i][j]=vis[j]?vis[j]:inf;
}
memset(dp,0x3f,sizeof(dp)),dp[][]=;
for(int i=;i<=n1;i++)
for(int j=;j<=n2;j++)
dp[i+][j]=min(dp[i+][j],dp[i][j]),
dp[i+][g[j][a[i]]]=min(dp[i+][g[j][a[i]]],dp[i][j]+);
for(int i=;i<=n1+;i++)ans4=min(ans4,dp[i][inf]);
printf("%d\n%d\n%d\n%d\n",ans1==inf?-:ans1,ans2==inf?-:ans2,ans3==inf?-:ans3,ans4==inf?-:ans4);
}

最新文章

  1. asp.net开发中遇到的奇葩bug及解决办法(会持续更新。。。)
  2. Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)
  3. Shell编程基础教程1--Shell简介
  4. c++ socket编程步骤
  5. spring mvc 请求转发和重定向
  6. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q104-Q106)
  7. post 405 method not allowed
  8. jQuery修改操作css属性实现方法
  9. 【翻译】Android避免内存泄露(Activity的context 与Context.getApplicationContext)
  10. NoMachine 远程桌面控制
  11. C# 开机启动代码
  12. Oracle查看和修改连接数(进程/会话/并发等等)
  13. 【原创】leetCodeOj --- Min Stack 解题报告
  14. JavaScript对象之document对象
  15. [补档][COGS 2434]暗之链锁
  16. 【springboot】之自动配置原理
  17. 探索未知种族之osg类生物---渲染遍历之Renderer简介
  18. 20172306 2018-2019《Java程序设计与数据结构课堂测试补充报告》
  19. lua C++ wrapper
  20. [Alg] 尺取法

热门文章

  1. JQuery特效之心形图片墙
  2. semiautomatic annotated tools
  3. ubuntu 14.04安装x11VNC
  4. Everything is a file
  5. eslint推荐编码规范和airbnb推荐编码规范
  6. Day 18 hashlib,logging模块
  7. Selenium3+python自动化-iframe
  8. tree:以树形结构显示目录下的内容
  9. php 后端实现JWT认证方法
  10. MyBatis学习总结(9)——使用MyBatis Generator自动创建代码