题目传送门

  传送点I

  传送点II

  传送点III

题目大意

  给定一个字符串$s$,和一个字符串$t$,$t$只包含小写字母,$s$包含小写字母和通配符'?'。询问$t$可能在$s$中出现最多多少次。

  原来觉得挺神仙,现在觉得还好。

  显然用$g_{i}$表示在匹配到第$i$个字符,最多能匹配$t$的次数。

  现在讨论它的转移,需要考虑它和前一个匹配有没有重叠。

  1. 如果没有重叠,直接从$g_{i - |t|}$转移。
  2. 如果有重叠,上一个可能的匹配的结束位置显然是可以枚举的,通过跳$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 ;
}

最新文章

  1. install hadoop on xubuntu
  2. AOP基本名词解释
  3. 将服务器上的myql数据库导入本地数据库
  4. CoreOS 835.12.0 稳定版安装
  5. 如何优雅的写C++代码(一)
  6. iOS第三方支付-微信支付
  7. ER模型到关系模型的转换规则
  8. c# PrintDocument 设置自定义纸张大小的示例
  9. leetcode Letter Combinations of a Phone Number python
  10. UNIX环境高级编程——网络基础概念
  11. Myeclipse 设定文件的默认打开方式
  12. C语言_第一讲_C语言入门
  13. Spring源码情操陶冶-PathMatchingResourcePatternResolver路径资源匹配溶解器
  14. P3366 【模板】最小生成树
  15. 易爆物D305
  16. vue 控制视图
  17. DNN原理探究系列之目录与序章篇
  18. 查看linux发行版版本
  19. V-rep学习笔记:Geometric Constraint Solver(几何约束求解)
  20. 白话 Ruby 与 DSL 以及在 iOS 开发中的运用

热门文章

  1. Oracle 10g使用amdu抽取数据文件
  2. node.js初识08
  3. 大数据项目(MTDAP)随想
  4. Mongodb 分组查询例子
  5. C语言---变量与函数
  6. JavaScript循环和数组常用操作
  7. 20165305 苏振龙《Java程序设计》第三周学习总结
  8. Locust 设置响应断言
  9. RocketMQ 顺序消费只消费一次 坑
  10. 随笔 js-----------------------------------------------------------------------------------------------------