题意:给你一个字符串s,以及两个字符串s1,s2.s中有些位置是*,意思是可以随便填字母,s的子串中如果出现一次s1,就加一分,如果出现一次s2,就减一分。问这个字符串s最多可以得多少分?

思路:

设dp[i][j][k]为到s串的i位置,s1的匹配长度是i,s2的匹配长度是j的情况下可以获得的最多分数。那么我们需要枚举这一位填什么字符,然后转移到下一个状态,所有以我们需要对s1和s2预处理一个东西:对s1/s2串匹配长度为i,并且i +1位置填的是字符c的时候,转移到的匹配长度,这个需要预处理一下。

代码:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1010;
const int maxm = 55;
char s[maxn], s1[maxm], s2[maxm];
int kmp_s1[maxm], Next_s1[maxm][26], kmp_s2[maxm], Next_s2[maxm][26];
int dp[maxn][55][55];
void init(char s[maxn], int len, int kmp[maxn], int Next[maxn][26]) {
kmp[1] = 0;
for (int i = 2, j = 0; i <= len; i++) {
while(j && s[j + 1] != s[i])j = kmp[j];
if(s[j + 1] == s[i])j++;
kmp[i] = j;
}
for (int i = 0; i <= len; i++) {
for (char c = 'a'; c <= 'z'; c++) {
int now = i;
while(now && s[now + 1] != c) now = kmp[now];
if(s[now + 1] == c) now++;
Next[i][c - 'a'] = now;
}
}
}
int main() {
scanf("%s%s%s", s + 1, s1 + 1, s2 + 1);
int len = strlen(s + 1), n = strlen(s1 + 1), m = strlen(s2 + 1);
init(s1, n, kmp_s1, Next_s1);
init(s2, m, kmp_s2, Next_s2);
memset(dp, 0xcf, sizeof(dp));
dp[0][0][0] = 0;
for (int i = 0; i <= len; i++)
for (int j = 0; j <= n; j++)
for (int k = 0; k <= m; k++) {
for (int c = 0; c < 26; c++) {
if(s[i + 1] == 'a' + c || s[i + 1] == '*') {
int tmp1 = Next_s1[j][c], tmp2 = Next_s2[k][c];
int tmp = dp[i][j][k] + (tmp1 == n) - (tmp2 == m);
dp[i + 1][tmp1][tmp2] = max(dp[i + 1][tmp1][tmp2], tmp);
}
}
}
int ans = -INF;
for (int i = 0; i <= n; i++)
for (int j = 0; j <= m; j++)
ans = max(ans, dp[len][i][j]);
printf("%d\n", ans);
}

  

Codeforces 1163D DP + KMP的更多相关文章

  1. Codeforces 1163D(kmp、dp)

    要点 \(dp[i][j][k]\)表示主串已经到第\(i\)位时,\(s\)匹配在\(j\)位.\(t\)匹配在\(k\)位的最大得分 本来就要试填一层循环,如果转移也写在循环里的化复杂度承受不了, ...

  2. BZOJ1009GT考试 DP + KMP + 矩陣快速冪

    @[DP, KMP, 矩陣快速冪] Description 阿申准备报名参加GT考试,准考证号为\(N\)位数\(X_1 X_2 .. X_n(0 <= X_i <= 9)\),他不希望准 ...

  3. codeforces 825F F. String Compression dp+kmp找字符串的最小循环节

    /** 题目:F. String Compression 链接:http://codeforces.com/problemset/problem/825/F 题意:压缩字符串后求最小长度. 思路: d ...

  4. CodeForces 494B Obsessive String ——(字符串DP+KMP)

    这题的题意就很晦涩.题意是:问有多少种方法,把字符串s划分成不重叠的子串(可以不使用完s的所有字符,但是这些子串必须不重叠),使得t串是所有这些新串的子串.譬如第一个样例,"ababa&qu ...

  5. Codeforces 1163D Mysterious Code(AC自动机+DP)

    用 AC自动机 来做有点想不到,捞一手就是学一手. 设 dp[ i ][ j ] 表示字符串 c 中的第 i 位到字典树上节点 j 的最大值是多少, word[ j ] 表示在节点 j 下对答案修改的 ...

  6. DP × KMP

    几道用到KMP的DP题: hdu 5763    hdu 3689    hdu 3336    codeforces 494B    codevs 3945 关于KMP的nx数组: 如果在本文中看见 ...

  7. CF 346B. Lucky Common Subsequence(DP+KMP)

    这题确实很棒..又是无想法..其实是AC自动机+DP的感觉,但是只有一个串,用kmp就行了. dp[i][j][k],k代表前缀为virus[k]的状态,len表示其他所有状态串,处理出Ac[len] ...

  8. bzoj 1009 [HNOI2008]GT考试(DP+KMP+矩阵乘法)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1009 [题意] 给定一个字符串T,问长度为n且不包含串T的字符串有多少种. [思路] ...

  9. hdu-3689 Infinite monkey theorem 概率dp+kmp

    有一只猴子随机敲键盘,给出它可能敲的键以及敲各个键的概率. 输入:n,表示有多少个键,m,表示猴子会敲m次键 n个二元组(字母,数字) 表示键代表的字母及其被敲的概率. 最后一个目标字符串. 问这只猴 ...

随机推荐

  1. Android关于界面一定时间无操作自动跳转到指定界面的实现

    主要用到的功能,自定义一个定时器CountTimer继承CountDownTimer. public class CountTimer extends CountDownTimer { private ...

  2. ES6新增语法和内置对象(let,const, Array/String/Set 扩展方法(解构赋值,箭头函数,剩余参数))

    1.let ES6中新增的用于声明变量的关键字. let 声明的变量只在所处于的块级有效. 注意:使用 let 关键字声明的变量才具有块级作用域,var 关键字是不具备这个特点的. 1. 防止循环变量 ...

  3. 启动ABP项目

    1.在官网下载ABP项目 2.打开项目选择解决方案,右击还原NuGet包 3.修改appsettings.json中的ConnectionStrings 例子"ConnectionStrin ...

  4. Jenkins的安装、部署、启动(完整教程)

    测试环境 Linux系统 Centos 7 安装步骤: 1.安装jdk 我安装的是jdk8,此处就不多说了,自己百度哈,很简单 2.安装jenkins 首先依次执行如下三个命令: 2.1.导入镜像: ...

  5. vue.js 分页

    <template> <div class="index"> <el-pagination background :hide-on-single-pa ...

  6. c++11引入特性

    * 支持类内初始化. class A{ vector<string> strs{"abc", "def"}; };

  7. sql 实现分页+分组并取出分组内的前n条数据

    一.建表 if exists (select * from sysobjects where id = OBJECT_ID('[test]') and OBJECTPROPERTY(id, 'IsUs ...

  8. linux基础(六)

    今天我们来看一下Samba服务和nginx服务. Samba服务 1.samba的功能 samba是一个网络服务器,用于Linux和Windows之间共享文件. 2.samba服务的启动.停止.重启  ...

  9. PHP curl_pause函数

    curl_pause — 暂停及恢复连接. 说明 int curl_pause ( resource $ch , int $bitmask ) 参数 ch 由 curl_init() 返回的 cURL ...

  10. paper 144:人生苦短,快用Python

    1.Python 语言特点 Python是一种面向对象.直译式计算机程序设计语言,这种语言的语法简捷而清晰,具有丰富和强大的类库,基本上能胜任你平时需要的编程工作. Python的优点: (1)编写的 ...