要点

  • \(dp[i][j][k]\)表示主串已经到第\(i\)位时,\(s\)匹配在\(j\)位、\(t\)匹配在\(k\)位的最大得分
  • 本来就要试填一层循环,如果转移也写在循环里的化复杂度承受不了,于是开两个表kmp预处理一下。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; char ch[1010], s[55], t[55];
int len, ls, lt, Ns[55], Nt[55];
int Ps[55][30], Pt[55][30];
int dp[1010][55][55], ans = 0xcfcfcfcf; void GetNext(char *s, int len, int *Next, int P[][30]) {
Next[1] = 0;
for (int i = 2, j = 0; i <= len; i++) {
while (j && s[j + 1] != s[i]) j = Next[j];
if (s[i] == s[j + 1]) j++;
Next[i] = j;
}
for (int i = 0; i <= len; i++)
for (int c = 0; c < 26; c++) {
int j = i;
while (j && s[j + 1] != c + 'a') j = Next[j];
if (s[j + 1] == c + 'a') j++;
P[i][c] = j;
}
} int main() {
scanf("%s%s%s", ch + 1, s + 1, t + 1);
len = strlen(ch + 1), ls = strlen(s + 1), lt = strlen(t + 1);
GetNext(s, ls, Ns, Ps), GetNext(t, lt, Nt, Pt); memset(dp, 0xcf, sizeof dp);
dp[0][0][0] = 0;
for (int i = 0; i < len; i++)
for (int j = 0; j <= ls; j++)
for (int k = 0; k <= lt; k++)
for (int c = 0; c < 26; c++) {
if (ch[i + 1] != '*' && ch[i + 1] - 'a' != c) continue;
if (dp[i][j][k] == 0xcfcfcfcf) continue;
int a = Ps[j][c], b = Pt[k][c];
dp[i + 1][a][b] = max(dp[i + 1][a][b], dp[i][j][k] + (a == ls) - (b == lt));
}
for (int i = 0; i <= ls; i++)
for (int j = 0; j <= lt; j++)
ans = max(ans, dp[len][i][j]);
return !printf("%d\n", ans);
}

最新文章

  1. 关于Django 错误 查询之后结果序列化出现的问题is not JSON serializable
  2. Linux C编程学习之开发工具3---多文件项目管理、Makefile、一个通用的Makefile
  3. Codeforces 727 D T-shirts Distribution
  4. Mac下Erlang环境安装
  5. Android自动检测版本及自动升级
  6. java arrayCopy
  7. submit回车提交影响
  8. 50元制作PS2键盘无线监控装置
  9. 架构之高可用性(HA)集群(Keepalived)
  10. selenium IDE中log的保存与查看方法
  11. ISP PIPLINE (九_2) Denoise 之 time domain denoise
  12. Android图片选择---MultiImageSelector的使用
  13. 直达核心的快速学习PHP入门技巧
  14. Android style 继承
  15. angular 2 - 001 ng cli的安装和使用
  16. ElasicSearch(1)
  17. 使用docker redis-cluster集群搭建
  18. 对delphi中的数据敏感控件的一点探索
  19. 类(字符串型;日期时间型;Math)
  20. AngularJS中介者模式实例

热门文章

  1. jquery 3D分页翻转滑块
  2. MySQL上周新增激活用户在上周下单情况_20161107周一
  3. ACM学习历程—HDU1003 Max Sum(dp &amp;&amp; 最大子序列和)
  4. 【Lintcode】095.Validate Binary Search Tree
  5. Django 发送email配置详解及各种错误类型
  6. 如何在kindle 3上无法进入 http://www.google.com/reader, 先登陆www.google.com, 然后选择阅读器。
  7. 演讲:对 2000 多亿条数据做一次 group by 需要多久?
  8. springboot集成报错,想要集成tk.mybatis报错,反射方法异常
  9. ICU 是一种说不出的痛啊
  10. InetAddress 类简介