传送门
题解:
建立KMP自动机。
设 f [ i ] [ j ] f[i][j] f[i][j]表示考虑了第一个串的前 i i i个位置,匹配到 j j j,且没有完全匹配过第二个串,前 i i i个位置中最多能够保留多少个,转移直接利用KMP自动机xjb写就行了。第一维顺便滚动数组优化一下。
代码:
#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs const
using std::cerr;
cs int N=1e4+7,M=1e3+7;
char s[N],t[M];
int tr[M][26],nxt[M];
int f[M],g[M];
int n,m;
signed main(){
#ifdef zxyoi
// freopen("necklace.in","r",stdin);
#endif
scanf("%s%s",s+1,t+1);
n=strlen(s+1),m=strlen(t+1);
for(int re i=1;i<=n;++i)s[i]-='a';
for(int re j=1;j<=m;++j)t[j]-='a';
for(int re i=0;i<m;++i){
int p=tr[i][t[i+1]];
tr[i][t[i+1]]=i+1;
for(int re c=0;c<26;++c)tr[i+1][c]=tr[p][c];
}
for(int re i=1;i<=n;++i){
for(int re j=0;j<m;++j){
int p=tr[j][s[i]];
f[p]=std::max(f[p],g[j]+1);
}
memcpy(g,f,sizeof(int)*m);
}
int ans=0;
for(int re i=0;i<m;++i)ans=std::max(ans,f[i]);
printf("%d",n-ans);
return 0;
}