Codeforces 808G Anthem of Berland - KMP - 动态规划
原来觉得挺神仙,现在觉得还好。
显然用$g_{i}$表示在匹配到第$i$个字符,最多能匹配$t$的次数。
现在讨论它的转移,需要考虑它和前一个匹配有没有重叠。
- 如果没有重叠,直接从$g_{i - |t|}$转移。
- 如果有重叠,上一个可能的匹配的结束位置显然是可以枚举的,通过跳$fail$就能找到。我们记一个$f_{i}$表示恰好最后一个匹配在$i$处结束时的最多匹配次数。然后就可以转移了。
Code
/**
* Codeforces
* Problem#808G
* Accepted
* Time: 46ms
* Memory: 1400k
*/
#include <bits/stdc++.h>
using namespace std;
typedef bool boolean; const int N = 1e5 + ; int n, m;
char S[N], T[N]; inline void init() {
scanf("%s%s", S + , T + );
n = strlen(S + );
m = strlen(T + );
} int fail[N];
void kmp() {
fail[] = fail[] = ;
for (int i = , j; i <= m; i++) {
j = fail[i];
while (j && T[i + ] != T[j + ])
j = fail[j];
fail[i + ] = ((T[i + ] == T[j + ]) ? (j + ) : ());
}
} boolean match(char *str) {
for (int i = ; i <= m; i++)
if (str[i] != T[i] && str[i] != '?')
return false;
return true;
} int f[N], g[N]; // f: maximum match times when ends at i, g: maximum match times when ends before i ant at i.
inline void solve() {
kmp();
for (int i = m; i <= n; i++) {
if (match(S + (i - m))) {
f[i] = max(f[i], g[i - m] + );
for (int j = fail[m]; j; j = fail[j])
f[i] = max(f[i], f[i - m + j] + );
}
g[i] = max(f[i], g[i - ]);
}
printf("%d\n", g[n]);
} int main() {
init();
solve();
return ;
}
Codeforces 808G Anthem of Berland - KMP - 动态规划的更多相关文章
- codeforces 808G Anthem of Berland
codeforces 808G Anthem of Berland 题面 给定\(s\)串和\(t\)串,字符集是小写字母.\(s\)串中有些位置的值不确定,要求你确定这些位置上的值,使得\(t\)在 ...
- Codeforces 808G Anthem of Berland【KMP】【DP】
LINK 简要题意 给你一个串s,上面有字母和一些通配符,问你将通配符换成字母之后最多可以出现多少次串t 首先有一个很傻子的做法就是\(dp_{i,j}\)表示s到第i个位置匹配t串前j个字符的完整t ...
- Codeforces 808G Anthem of Berland(KMP+基础DP)
题意 给定一个字符串 \(s\) ,一个字符串 \(t\) ,其中 \(s\) 包含小写字母和 "?" ,\(t\) 只包含小写字母,现在把 \(s\) 中的问号替换成任意的小写字 ...
- Codeforces 581F Zublicanes and Mumocrates - 树形动态规划
It's election time in Berland. The favorites are of course parties of zublicanes and mumocrates. The ...
- CodeForces 164 B. Ancient Berland Hieroglyphs 单调队列
B. Ancient Berland Hieroglyphs 题目连接: http://codeforces.com/problemset/problem/164/B Descriptionww.co ...
- Codeforces 432D Prefixes and Suffixes(KMP+dp)
题目连接:Codeforces 432D Prefixes and Suffixes 题目大意:给出一个字符串,求全部既是前缀串又是后缀串的字符串出现了几次. 解题思路:依据性质能够依据KMP算法求出 ...
- Codeforces 835F Roads in the Kingdom - 动态规划
题目传送门 传送点I 传送点II 传送点III 题目大意 给定一颗基环树,要求删去其中一条边,使得剩下的图形是一棵树,并且最长路的长度最短,求最长路的最短长度. 路径可以分为两部分:跨过环 和 在树内 ...
- Codeforces 946 D.Timetable-数据处理+动态规划(分组背包) 处理炸裂
花了两个晚上来搞这道题. 第一个晚上想思路和写代码,第二个晚上调试. 然而还是菜,一直调不对,我的队友是Debug小能手呀(真的是无敌,哈哈,两个人一会就改好了) D. Timetable tim ...
- 【Codeforces 949D】Shake It! 【动态规划】
参考: http://blog.csdn.net/gjghfd/article/details/77824901 所求的是满足条件的图中“不同构”的数量,意味着操作的顺序是可以忽略的.考虑若干次操作后 ...
随机推荐
- 当我的url请求会变成jsp页面路径时的解决办法
@RequestMapping(value="shippingOrder") $.post("/ezsh/orderAd/shippingOrder",para ...
- 关于第一次java课的感想
首先必须承认,这次的题目还是很简单的,因为这道题完全就是换了个包装的小学期题目,也就是说,如果让我用C++来编写,我可以保证3个小时内编写完毕,也许在一些小的方面,比如输入数字的合法性上存在问题,但毕 ...
- Mysql自增ID起始值修改
在mysql中很多朋友都认为字段为AUTO_INCREMENT类型自增ID值是无法修改,其实这样理解是错误的,下面介绍mysql自增ID的起始值修改与设置方法.通常的设置自增字段的方法:创建表格时添加 ...
- Java之.jdk安装-Linux
Jdk安装-Linux 1. 使用管理员,创建一个用户(charles),指令:useradd charles 2. 给创建的用户,添加密码(密码自己指定),指令:passwd charles 注意: ...
- 关于Sublime Text3的emmet插件和tab快捷键冲突问题
当使用Sublime text3时会遇到快捷键冲突的问题,其中就有安装Emmet之后,tab无法缩进了, 网上有些说看看Browse Packages目录下是否有PyV8插件安装,该插件一般情况下随E ...
- 常用脚本lnmp
3)安装lnmp脚本只供参考需修改相应参数 #!/bin/bash#Function: Install LNMP#Author: wang#Date: 20170809 nginx_install() ...
- https加密过程
https加密完整过程 step1: “客户”向服务端发送一个通信请求 “客户”->“服务器”:你好 step2: “服务器”向客户发送自己的数字证书.证书中有一个公钥用来加密信息,私钥由“服务 ...
- Rpgmakermv(25) 游戏数据
随着对RMMV插件了解的深入,我们会发现如果我们想要对游戏数据进行一些扩展,首先要了解游戏数据,游戏数据在官方代码中的rpg_managers.js里,这一节我们将要对这个官方类有一些基础的了解,并且 ...
- Windows10上安装Keras 和 TensorFlow-GPU
安装环境: Windows 10 64bit GPU: GeForce gt 720 Python: 3.5.3 CUDA: 8 首先下载Anaconda3的Win10 64bit版,安装Python ...
- arc 092D Two Sequences
题意: 给出两个长度N相同的整数序列A和B,有N^2种方式从A中选择一个数Ai,从B中选择一个数Bj,让两个数相加,求这N^2个数的XOR,即异或. 思路: 暴力的求显然是会超时的,因为是异或,就考虑 ...