题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032

不是 b 的子串的话就对 b 建后缀自动机,在 a 上枚举从每个位置开始的子串或者找子序列(子序列就是记录 a 的前 i 个,走到 b 的 j 状态用的最短长度),对应到自动机上看看能不能走下去就行了。

不是 b 的子序列的话就对 b 建子序列自动机?就是那个知道每个位置再填一个字符会走到哪个位置的数组。然后在 a 上枚举,看看自动机上能不能走下去就行了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=,K=;
char a[N],b[N];
int n,m,cnt=,lst=,go[M][K],fa[M],l[M],nxt[N][K],lt[K];
int dp[N][M];//M//int
int Mn(int a,int b){return a<b?a:b;}
void add(int w)
{
int p=lst,np=++cnt;lst=np;l[np]=l[p]+;
for(;p&&!go[p][w];p=fa[p])go[p][w]=np;
if(!p)fa[np]=;
else
{
int q=go[p][w];
if(l[q]==l[p]+)fa[np]=q;
else
{
int nq=++cnt;l[nq]=l[p]+;
fa[nq]=fa[q];fa[q]=nq;fa[np]=nq;
memcpy(go[nq],go[q],sizeof go[q]);
for(;go[p][w]==q;p=fa[p])go[p][w]=nq;
}
}
}
void solve1()
{
int ans=n+;
for(int i=;i<=n;i++)
{
int cr=;
for(int j=i;j<=n;j++)
{
if(!go[cr][a[j]-'a'+])
{ans=Mn(ans,j-i+);break;}
cr=go[cr][a[j]-'a'+];
}
}
printf("%d\n",ans>n?-:ans);
}
void solve2()
{
int ans=n+;
for(int t=;t<=n;t++)
{
int cr=;
for(int i=t;i<=n;i++)
{
int d=a[i]-'a'+;
if(nxt[cr][d])cr=nxt[cr][d];
else {ans=Mn(ans,i-t+);break;}
}
}
printf("%d\n",ans>n?-:ans);
}
void solve3()
{
memset(dp,0x3f,sizeof dp);
dp[][]=; int ans=n+;
for(int i=;i<=n;i++)
{
int d=a[i]-'a'+;
for(int j=;j<=cnt;j++)
if(dp[i-][j]<=n)
{
dp[i][j]=Mn(dp[i][j],dp[i-][j]);
if(!go[j][d])ans=Mn(ans,dp[i-][j]+);
else dp[i][go[j][d]]=Mn(dp[i][go[j][d]],dp[i-][j]+);
}
}
printf("%d\n",ans>n?-:ans);
}
void solve4()
{
memset(dp,0x3f,sizeof dp);
dp[][]=; int ans=n+;
for(int i=;i<=n;i++)
{
int d=a[i]-'a'+;
for(int j=;j<=m;j++)
if(dp[i-][j]<=n)
{
dp[i][j]=Mn(dp[i][j],dp[i-][j]);
if(!nxt[j][d])ans=Mn(ans,dp[i-][j]+);
else dp[i][nxt[j][d]]=Mn(dp[i][nxt[j][d]],dp[i-][j]+);
}
}
printf("%d\n",ans>n?-:ans);
}
int main()
{
scanf("%s",a+);scanf("%s",b+);
n=strlen(a+);m=strlen(b+);
for(int i=;i<=m;i++)add(b[i]-'a'+);
for(int i=m;i>=;i--)
{
for(int j=;j<=;j++)
nxt[i][j]=lt[j];
lt[b[i]-'a'+]=i;
}
solve1();solve2();
solve3();solve4();
return ;
}

最新文章

  1. 面试 JavaWeb 部分
  2. 在VC下采用ADO实现BLOB(Binary)数据的存储,读取,修改,删除。
  3. 分布式服务框架Zookeeper
  4. linux之iptables总结
  5. 浅析extendedLayout, automaticallyAdjustsScrollViewInsets, extendedLayoutIncludesOpaqueBars
  6. HDU 1504 Disk Tree
  7. (转)UIWebView与JavaScript的那些事儿
  8. Codeforces Round #256 (Div. 2) 题解
  9. 移动平台下的Socket几个问题
  10. Spring @AfterReturning 总是返回null
  11. CSDN_投票评选_JS_分析脚本
  12. Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.
  13. 步步為營-98-MyAPI
  14. Mac配置SDK+JDK环境
  15. SQL SERVER深入学习学习资料参考
  16. Unity的 NavMeshObstacle 的使用详解
  17. for, while的用法
  18. 快速理解linux流编辑器sed命令
  19. Java I/O(一) NIO概述
  20. make命令和makefile文件

热门文章

  1. sql server 2014 在windows server 2012 上安装Analysis Services
  2. 用Heartbeat实现HA集群
  3. pOJ-1061 exgcd求同余方程组
  4. 二 web爬虫,scrapy模块以及相关依赖模块安装
  5. shell基础复习笔记
  6. cvSmooth函数 和 OpenCV自带的人脸检测
  7. 删除 mac 垃圾桶内清除不掉的文件
  8. MYSQL(python)安装记录
  9. 【spark】共享变量
  10. SpringBoot_11_将springboot项目部署到外部tomcat上