提交时间:2025-02-10 19:06:04

运行 ID: 36287

#include<bits/stdc++.h> #define int long long using namespace std; const int B=31; const int mod=1011451423; const int N=1e5+7; const int K=37; int n,m,k; char S[N],T[N]; int Pow[N],H[N][2]; inline void CMax(int &a,int b){a=max(a,b);} inline void Init(){ cin>>k; cin>>S+1>>T+1; n=strlen(S+1),m=strlen(T+1); Pow[0]=1; for(int i=1;i<=max(n,m);i++)Pow[i]=Pow[i-1]*B%mod; for(int i=1;i<=n;i++)H[i][0]=(H[i-1][0]*B%mod+S[i]-'A')%mod; for(int i=1;i<=m;i++)H[i][1]=(H[i-1][1]*B%mod+T[i]-'A')%mod; } inline int Has(int l,int r,int t){ return (H[r][t]-H[l-1][t]*Pow[r-l+1]%mod+mod)%mod; } inline bool Eq(int P1,int P2,int Len){ if(!Len)return 1; return Has(P1,P1+Len-1,0)==Has(P2,P2+Len-1,1); } inline int LCP(int P1,int P2){ int l=0,r=min(n-P1+1,m-P2+1); while(l<r){ int mid=l+r+1>>1; if(Eq(P1,P2,mid))l=mid; else r=mid-1; }return l; } int f[K][K<<1]; int Ans[K]; inline void DP(int L){ memset(f,-63,sizeof(f)); f[0][k]=0; for(int i=0;i<=k;i++){ for(int j=0;j<=(k<<1);j++){ if(f[i][j]>=0&&f[i][j]+j-k>=0&&L-1+f[i][j]+j-k<=m){ // 状态可达到 && 匹配的 S 合法 && 匹配的 T(加上前面的 L)不超过 m f[i][j]+=LCP(f[i][j]+1,L+f[i][j]+j-k); CMax(f[i+1][j+1],f[i][j]);/*Ins*/ if(j)CMax(f[i+1][j-1],f[i][j]+(f[i][j]!=n));/*Del*/ CMax(f[i+1][j],f[i][j]+(f[i][j]!=n));/*Replace*/ } } } for(int j=0;j<=2*k;j++){ for(int i=0;i<=k;i++){ if(f[i][j]==n&&n+j-k>0&&L-1+n+j-k<=m){ // 状态能够匹配 S 全串 && S 此时对应的 T 非空 && 匹配的 T(加上前面的 L)不超过 m Ans[i]++; break; //[L,L-1+n+j-k] } } } } signed main(){ #ifndef ONLINE_JUDGE freopen("edit.in","r",stdin); freopen("edit.out","w",stdout); #endif Init(); for(int i=1;i<=m;i++)DP(i); for(int i=0;i<=k;i++)cout<<Ans[i]<<endl; cout<<endl; return 0; }