P1758 [NOI2009]管道取珠
SOL
woc什么神题Orz
a
i
2
ai^2
ai2
可以理解为两个人用两对一模一样的管道
然后各自进行一个操作序列之后产生相同输出序列的即为
a
i
2
ai^2
ai2
设 f [ k ] [ i ] [ j ] f[k][i][j] f[k][i][j]表示第一个人在上管取了 i i i个,第二个人在上管取了 j j j个,输出序列长度为 k k k且相同的答案
然后就可以转移了
代码:
#include<bits/stdc++.h>
using namespace std;
#define re register
const int N=505,mod=1024523;
int n,m,f[2][N][N]={1};char ch,u[N],d[N];
signed main(){
scanf("%d%d",&n,&m),scanf("%s%s",u+1,d+1);
reverse(u+1,u+n+1),reverse(d+1,d+m+1);
for(int re k,t=1;t<=n+m;++t){
k=t&1,memset(f[k],0,sizeof f[k]);
for(int re i=max(0,t-m);i<=min(n,t);++i)
for(int re j=max(0,t-m);j<=min(n,t);++j){
if(i&&j&&u[i]==u[j])(f[k][i][j]+=f[k^1][i-1][j-1])%=mod;
if(i&&t-j&&u[i]==d[t-j])(f[k][i][j]+=f[k^1][i-1][j])%=mod;
if(t-i&&j&&d[t-i]==u[j])(f[k][i][j]+=f[k^1][i][j-1])%=mod;
if(t-i&&t-j&&d[t-i]==d[t-j])(f[k][i][j]+=f[k^1][i][j])%=mod;
}
}printf("%d",f[(n+m)&1][n][n]);return 0;
}