题解

假如我们非常熟练的看出来,平方和转有序对统计的套路的话,应该就不难了

我们只需要统计(wayA,wayB)生成的序列一样的有序对个数就行

可以用一个\(n^3\)的dp解决

\(dp[i][j][k]\)表示选到第i个,第一个序列用j个上管道的球,第二个序列用了k的上管道的球,要求下一次操作两个球长得一样就可以了

代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <map>
//#define ivorysi
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define mo 974711
#define RG register
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {putchar('-');x = -x;}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 1024523;
int dp[2][505][505],N,M;
char up[505],down[505];
void update(int &x,int y) {
x = x + y;
if(x >= MOD) x -= MOD;
}
void Solve() {
scanf("%d%d",&N,&M);
scanf("%s",up + 1);scanf("%s",down + 1);
up[N + 1] = 'C';down[M + 1] = 'D';
int cur = 0;
dp[0][0][0] = 1;
for(int i = 0 ; i < N + M ; ++i) {
int t = min(i,N);
memset(dp[cur ^ 1],0,sizeof(dp[cur ^ 1]));
for(int j = 0 ; j <= t ; ++j) {
for(int k = 0 ; k <= t ; ++k) {
if(up[j + 1] == up[k + 1] && j != N && k != N) update(dp[cur ^ 1][j + 1][k + 1],dp[cur][j][k]);
if(up[j + 1] == down[i - k + 1]) update(dp[cur ^ 1][j + 1][k],dp[cur][j][k]);
if(down[i - j + 1] == up[k + 1]) update(dp[cur ^ 1][j][k + 1],dp[cur][j][k]);
if(down[i - j + 1] == down[i - k + 1]) update(dp[cur ^ 1][j][k],dp[cur][j][k]);
}
}
cur ^= 1;
}
out(dp[cur][N][N]);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}

最新文章

  1. Go语言执行系统命令行命令(转)
  2. PMI列子1
  3. Lucene/Solr搜索引擎开发笔记 - 第2章 Solr安装与部署(Tomcat篇)
  4. iOS 原生态扫描二维码、条形码的功能。
  5. Solaris磁盘设备
  6. DevExpress GridControl 使用方法技巧 总结 收录整理
  7. HW7.6
  8. Oracle OCI-22053:溢出错误
  9. asp.net程序中如何使用皮肤更换的小功能
  10. Oracle表、列、约束的操作
  11. 【CKEditor ASP.NET】解决360安全浏览器极速模式下不显示
  12. matlab 中max函数用法
  13. RMQ问题--范围最小值问题
  14. JavaScript 隐式类型转换之:加号+
  15. open-falcon之judge
  16. fuzz系列之afl
  17. JAVA StringUtils需要导入的包
  18. IOS----UIScrollerView的使用
  19. SQL还原数据库后孤立用户问题处理(SQL 数据库 拥有对象 无法删除)
  20. Netbackup:nbu常见错误及故障解决

热门文章

  1. 介绍——基于类的视图(class-based view)
  2. 2017 清北济南考前刷题Day 6 afternoon
  3. 穷竭搜索:POJ 3187 Backward Digit Sums
  4. Google推荐的15条HTML 5代码军规----来看看你知道几个,我一个都不知道。。。
  5. 渐变色之location概念.
  6. PHP返回Json数据函数封装
  7. Struts2笔记2--动态方法调用和Action接收请求方式
  8. 用Qemu模拟vexpress-a9 (一) --- 搭建Linux kernel调试环境【转】
  9. Java不为人知的小秘密
  10. Visual Studio 2017 for Mac