开始 2025-02-10 11:58:28

【2025noip】20250210更正

结束 2025-02-28 00:00:00
Contest is over.
当前 2025-05-01 03:01:35

T4 代码。有注释。

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;

}


2338bitexplo  •  2个月前

比赛已结束。