1 条题解

  • 0
    @ 2025-12-1 20:39:31
    // 线性DP 滚动数组 O(n^2)
    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=5010,mod=1e8;
    int n,m;
    char a[N],b[N];
    int f[2][N],g[2][N];
    
    int main(){
      scanf("%s %s",a+1,b+1);
      n=strlen(a+1)-1; m=strlen(b+1)-1;
      
      for(int k=0; k<=m; k++) g[0][k]=1;
      g[1][0]=1;
      
      int u=0;
      for(int i=1; i<=n; i++){
        u^=1;
        for(int j=1; j<=m; j++){
          if(a[i]==b[j]) f[u][j]=f[u^1][j-1]+1;
          else f[u][j]=max(f[u^1][j],f[u][j-1]);
          g[u][j]=0;
          if(a[i]==b[j]&&f[u][j]==f[u^1][j-1]+1) g[u][j]+=g[u^1][j-1];
          if(f[u][j]==f[u^1][j]) g[u][j]+=g[u^1][j];
          if(f[u][j]==f[u][j-1]) g[u][j]+=g[u][j-1];
          if(f[u][j]==f[u^1][j-1]) g[u][j]-=g[u^1][j-1]; //容斥
          g[u][j]%=mod;
        }
      }
      printf("%d\n%d",f[u][m],g[u][m]);
    }
    
    • 1

    信息

    ID
    4088
    时间
    1000ms
    内存
    128MiB
    难度
    7
    标签
    递交数
    96
    已通过
    23
    上传者