LINK


简要题意

给你一个串s,上面有字母和一些通配符,问你将通配符换成字母之后最多可以出现多少次串t


首先有一个很傻子的做法就是\(dp_{i,j}\)表示s到第i个位置匹配t串前j个字符的完整t串个数

然后每次枚举前缀看看能不能转移。。。太不优秀了

那么就考虑这样做:

\(dp_{i}\)表示最后一个出现的完整的串t在第i个位置结尾的最大出现次数

\(maxv_{i}\)表示最后一个出现的完整的串t在第i个位置前结尾的最大出现次数

首先有一个转移是,如果当前位置被匹配,那么\(dp_{i} = maxv_{i - lent} + 1\)

或者我们就需要枚举当前串和上一个的公共长度

这样就相当于枚举t的一个是前缀又是后缀的东西

就很容易想到跳fail

然后就加上一个kmp板子就可以了

复杂度是\(|s|*|t|\)的


  1. //Author: dream_maker
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. //----------------------------------------------
  5. //typename
  6. typedef long long ll;
  7. //convenient for
  8. #define fu(a, b, c) for (int a = b; a <= c; ++a)
  9. #define fd(a, b, c) for (int a = b; a >= c; --a)
  10. #define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
  11. //inf of different typename
  12. const int INF_of_int = 1e9;
  13. const ll INF_of_ll = 1e18;
  14. //fast read and write
  15. template <typename T>
  16. void Read(T &x) {
  17. bool w = 1;x = 0;
  18. char c = getchar();
  19. while (!isdigit(c) && c != '-') c = getchar();
  20. if (c == '-') w = 0, c = getchar();
  21. while (isdigit(c)) {
  22. x = (x<<1) + (x<<3) + c -'0';
  23. c = getchar();
  24. }
  25. if (!w) x = -x;
  26. }
  27. template <typename T>
  28. void Write(T x) {
  29. if (x < 0) {
  30. putchar('-');
  31. x = -x;
  32. }
  33. if (x > 9) Write(x / 10);
  34. putchar(x % 10 + '0');
  35. }
  36. //----------------------------------------------
  37. const int N = 1e5 + 10;
  38. char s[N], t[N];
  39. int fail[N], dp[N], maxv[N];
  40. void getfail(char *s) {
  41. int lens = strlen(s + 1);
  42. int j = 0; fail[1] = 0;
  43. fu(i, 2, lens) {
  44. while (j && s[j + 1] != s[i]) j = fail[j];
  45. if (s[j + 1] == s[i]) ++j;
  46. fail[i] = j;
  47. }
  48. }
  49. bool match(char *s, int pos, char *t, int len) {
  50. fu(i, 1, len)
  51. if (s[pos + i -1] != t[i] && s[pos + i - 1] != '?') return 0;
  52. return 1;
  53. }
  54. int main() {
  55. #ifdef dream_maker
  56. freopen("input.txt", "r", stdin);
  57. #endif
  58. scanf("%s%s", s + 1, t + 1);
  59. getfail(t);
  60. int lens = strlen(s + 1), lent = strlen(t + 1);
  61. fu(i, lent, lens) {
  62. if (match(s, i - lent + 1, t, lent)) {
  63. dp[i] = max(dp[i], maxv[i - lent] + 1);
  64. int j = fail[lent];
  65. while (j) {
  66. dp[i] = max(dp[i], dp[i - (lent - j)] + 1);
  67. j = fail[j];
  68. }
  69. maxv[i] = max(maxv[i], dp[i]);
  70. }
  71. maxv[i] = max(maxv[i], maxv[i - 1]);
  72. }
  73. Write(maxv[lens]);
  74. return 0;
  75. }

Codeforces 808G Anthem of Berland【KMP】【DP】的更多相关文章

  1. Codeforces 808G Anthem of Berland(KMP+基础DP)

    题意 给定一个字符串 \(s\) ,一个字符串 \(t\) ,其中 \(s\) 包含小写字母和 "?" ,\(t\) 只包含小写字母,现在把 \(s\) 中的问号替换成任意的小写字 ...

  2. codeforces 808G Anthem of Berland

    codeforces 808G Anthem of Berland 题面 给定\(s\)串和\(t\)串,字符集是小写字母.\(s\)串中有些位置的值不确定,要求你确定这些位置上的值,使得\(t\)在 ...

  3. Codeforces 808G Anthem of Berland - KMP - 动态规划

    题目传送门 传送点I 传送点II 传送点III 题目大意 给定一个字符串$s$,和一个字符串$t$,$t$只包含小写字母,$s$包含小写字母和通配符'?'.询问$t$可能在$s$中出现最多多少次. 原 ...

  4. 【单调队列优化dp】 分组

    [单调队列优化dp] 分组 >>>>题目 [题目] 给定一行n个非负整数,现在你可以选择其中若干个数,但不能有连续k个数被选择.你的任务是使得选出的数字的和最大 [输入格式] ...

  5. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

  6. 1415. [NOI2005]聪聪和可可【记忆化搜索DP】

    Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点 ...

  7. 【KMP求最小周期】POJ2406-Power Strings

    [题意] 给出一个字符串,求出最小周期. [思路] 对KMP的next数组的理解与运用orz ①证明:如果最小周期不等于它本身,则前缀和后缀必定有交叉. 如果没有交叉,以当前的next[n]为最小周期 ...

  8. POJ2406 Power Strings 【KMP 或 后缀数组】

    电源串 时间限制: 3000MS   内存限制: 65536K 提交总数: 53037   接受: 22108 描述 给定两个字符串a和b,我们定义a * b是它们的连接.例如,如果a =" ...

  9. 【kmp+最小循环节】poj 2406 Power Strings

    http://poj.org/problem?id=2406 [题意] 给定字符串s,s=a^n,a是s的子串,求n最大是多少 [思路] kmp中的next数组求最小循环节的应用 例如 ababab ...

随机推荐

  1. SecureCRT在mac下无法输入中断命令

    mac下输入Ctrl +C无法中断程序,这个问题困扰了我好久,大概有很长一段时间我都是使用kill 进程的方式来代替中断: ps aux | grep python kill -9 pid 今天终于发 ...

  2. 【转】asp.net 项目在 IE 11 下出现 “__doPostBack”未定义 的解决办法

    最近我们运营的网站有用户反馈在 IE 11 下<asp:LinkButton> 点击出现 “__doPostBack”未定义”,经过一番google,终于知道了原因:ASP.NET 可能无 ...

  3. [转载]在sublime中运行Java代码

    1.设置java的PATH环境变量 2.创建批处理或Shell脚本文件 runJava.bat: 将该文件复制到JDK的bin目录下. @echo off cd %~dp1 echo Compilin ...

  4. Amazon, Clear, Debian, Gentoo, Red Hat, SUSE & Ubuntu Performance On The EC2 Cloud

    https://www.phoronix.com/scan.php?page=article&item=ec2-holiday-2017&num=5

  5. 仅需15分钟,使用OpenCV+Keras轻松破解验证码

    https://baijia.baidu.com/s?id=1586732712477979223&wfr=pc&fr=app_lst

  6. jQuery之-拼图小游戏

    在线实例:http://lgy.1zwq.com/puzzleGame/ 源代码思路分析: [一]如何生成图片网格,我想到两种方法: (1)把这张大图切成16张小图,然后用img标签的src (2)只 ...

  7. Highcharts 基本区域图;Highcharts 使用负数区域图;Highcharts 堆叠区域图;Highcharts 百分比堆叠区域图

    Highcharts 基本区域图 配置 chart chart.type 配置项用于设定图表类型,默认为 "line",本章节我们使用 'area'. var chart = { ...

  8. mybatis定义拦截器

    applicationContext.xml <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlS ...

  9. C# 调用颜色的RGB值_RGB颜色转换十六进制颜色

    调用方法: 如:btn_FangTai.BackColor = Color.FromArgb(135, 206, 250); 十六进制颜色查询 颜   色 英文代码 形象描述 十六进制 RGB   L ...

  10. awk与sed:一个关于多行处理的例子

    前几天在CSDN上看到一个帖子http://bbs.csdn.net/topics/390848841,楼主贴了下面的问题: 例: 12345 67890 1234567890 123 4567890 ...