题目链接:https://ac.nowcoder.com/acm/problem/17621
#include <bits/stdc++.h>
#define LL long long
using namespace std;
char s[100005], t[100005];
LL f[2][510][510];
const int mod=1024523;
int main(){
int n, m; scanf("%d%d", &n, &m);
scanf("%s%s", s+1, t+1);
reverse(s + 1 , s + n + 1);
reverse(t + 1 , t + m + 1);
int pos=0; f[0][0][0]=1;
for(int i=0; i<=n; i++, pos^=1){
//memset(f[pos], 0, sizeof(f[pos]));
for(int j=0; j<=m; j++){
for(int k=0; k<=n; k++){
if(i+j-k<0||i+j-k>m) continue;
if(s[i+1]==s[k+1]){
f[pos^1][j][k+1]+=f[pos][j][k]; f[pos^1][j][k+1]%=mod;
}
if(s[i+1]==t[(i+j-k)+1]){
f[pos^1][j][k]+=f[pos][j][k]; f[pos^1][j][k]%=mod;
}
if(t[j+1]==s[k+1]){
f[pos][j+1][k+1]+=f[pos][j][k]; f[pos][j+1][k+1]%=mod;
}
if(t[j+1]==t[(i+j-k)+1]){
f[pos][j+1][k]+=f[pos][j][k]; f[pos][j+1][k]%=mod;
}
f[pos][j][k]=0;//这个状态已经发生转移,一定用不到了。
//cout<<i<<" "<<j<<" "<<k<<" "<<f[pos][j][k]<<endl;
}
}
}
printf("%lld\n", f[pos][m][n]);
return 0;
}

京公网安备 11010502036488号