Educational Codeforces Round 82 (Rated for Div. 2)E. Erase Subsequences

题目链接
题意:给你两个字符串 s , t s,t s,t,问你 t t t是否可以由 s s s的两个不相交子序列构成。
思路:显然我们应该枚举 t t t的断点 i i i,使得 [ 1 , i ] [1,i] [1,i]为一个子序列 [ i + 1 , l e n t ] [i+1,len_t] [i+1,lent]为第二个子序列。然后check这种情况是否合法.我们设前一半为 L L L,后一半为 R R R
d p [ i ] [ j ] dp[i][j] dp[i][j]表示当前匹配到 L i , R j L_i,R_j Li,Rj s s s中的最小位置。
d p [ l e n L ] [ l e n R ] < = l e n s dp[len_L][len_R]<=len_s dp[lenL][lenR]<=lens即合法。
转移用序列自动机优化一下即可.
注意一下细节问题.

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
#define fi first
#define se second
#define pb push_back
int t;
char a[N],b[N];
int dp[403][403];
int nx[555][26];
int main() {
  ios::sync_with_stdio(false);
  for(cin>>t;t;t--){
    cin>>a+1>>b+1;
    int l=strlen(a+1);
    int r=strlen(b+1);
    for(int i=0;i<26;i++)nx[l+1][i]=nx[l+2][i]=l+1;
    for(int i=l;i>=1;i--){
      for(int j=0;j<26;j++)nx[i][j]=nx[i+1][j];
      nx[i][a[i]-'a']=i;
    }
    int ok=0;
    for(int i=0;i<r;i++){
      memset(dp,-1,sizeof dp);
      dp[0][i]=0;
      for(int j=0;j<=i;j++){
        for(int k=i;k<=r;k++){
          if(j==0&&k==i)
            continue;
          dp[j][k]=l+1;
          if(j) dp[j][k]=min(dp[j][k],nx[dp[j-1][k]+1][b[j]-'a']);
          if(k>i)dp[j][k]=min(dp[j][k],nx[dp[j][k-1]+1][b[k]-'a']);
        }
      }
      if(dp[i][r]<=l){
        ok=1;
        //cout<<i<<' '<<r<<' '<<dp[i][r]<<endl;
        break;
      }
    }
    if(ok)cout<<"YES\n";
    else cout<<"NO\n";
  }
  return 0;
}
全部评论

相关推荐

01-23 14:54
同济大学 Java
热爱敲代码的程序媛:给你提几点【专业技能】这个模块里面可优化的地方:1.【具备JVM调优经验】可以去b站上搜一下JVM调优的视频,估计一两个小时凭你的学习能力就能掌握JVM调优的实践方面的技能。2.【MySql优化】MySql这一栏,你去b站或者找个博客看看MySql优化,学一下,如果你本身比较熟悉MySql语句的话,那基本半天时间凭你的学习能力MySql语句优化方面的技能你也能掌握个差不多。以上1,2两点主要是因为我看你专业技能大部分都说的是偏理论,没有写应用。再就是最后,你结合你的项目,想一想你的项目中哪些sql语句是可以用MySql优化的,到时候你面试的时候也好结合着说一下。
点赞 评论 收藏
分享
01-23 19:12
门头沟学院 Java
榨出爱国基因:你还差 0.1% 就拿到校招礼盒,快叫朋友给你砍一刀吧
投递拼多多集团-PDD等公司8个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务