根据题意,本题只关心前缀t是否匹配,而其他位置并不在意
因此我们将题目抽象成将s转转化为t串,其中t串的前m个是指定的,后面的是随意的
又因为s串从头往后并且可以插到两边,自然想到了区间dp,看数据范围也感觉很对,因为区间dp就是向两边扩充
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+10; const int mod=998244353; int f[3010][3010]; int main(){ string s,t; cin>>s>>t; s=" "+s; t=" "+t; int len,l,r; int n=(int)s.size()-1; int m=(int)t.size()-1; for(int i=1;i<=n+1;i++) f[i][i-1]=1; for(len=1;len<=n;len++){ for(l=1;l+len-1<=n;l++){ r=l+len-1; if(l>m||s[len]==t[l]) f[l][r]=(f[l][r]+f[l+1][r])%mod; if(r>m||s[len]==t[r]) f[l][r]=(f[l][r]+f[l][r-1])%mod; } } int ans=0; for(int i=m;i<=n;i++) ans=(ans+f[1][i])%mod; cout<<ans<<endl; }