题意

给定一个字符串 \(s\) ,一个字符串 \(t\) ,其中 \(s\) 包含小写字母和 "?" ,\(t\) 只包含小写字母,现在把 \(s\) 中的问号替换成任意的小写字母,求 \(t\) 最多在 \(s\) 中出现多少次,\(t\) 可以互相覆盖。

\(1 \leq |s| \leq 10^5\)

\(1 \leq |t| \leq 10^5\)

\(1 \leq |s|\cdot|t| \leq 10^7\)

思路

由于 \(|s|\cdot|t| \leq 10^7\) ,那么用 \(dp[i][j]\) 表示 \(s\) 匹配到第 \(i\) 位,\(t\) 匹配到第 \(j\) 位时的最多出现次数,如果出现"?",就枚举是哪个字符。需要预处理出在哪一位遇到什么字符,接下来要到哪里匹配的信息。

我们设 \(F[i][j]\) 为匹配到模式串 \(P\) 的第 \(i\) 位,遇到 \(j\) 字符,下一位应该匹配 \(P\) 的哪一位。这个数组可以和 \(f\) 数组一起交替处理,使两者复杂度都得到保证。这个数组的思想也很重要,在后面的 \(\text{AC}\) 自动机中也有体现。

代码

#include<bits/stdc++.h>
#define FOR(i,x,y) for(int i=(x),i##END=(y);i<=i##END;++i)
#define DOR(i,x,y) for(int i=(x),i##END=(y);i>=i##END;--i)
typedef long long LL;
using namespace std;
const int N=1e5+5;
const int NN=2e7+5;
char T[N],P[N];
int f[N],F[N][30]; //F[i][j]表示匹配到第i位为'a'+j,下一位应匹配哪一位
int dp[NN];
int n,m;
#define dp(i,j) dp[(i)*(m+5)+j] int main()
{
scanf("%s%s",T+1,P+1);
n=strlen(T+1),m=strlen(P+1); f[1]=f[2]=1;FOR(i,0,25)F[1][i]=1+(P[1]-'a'==i);
FOR(i,2,m)
{
f[i+1]=F[f[i]][P[i]-'a'];
FOR(j,0,25)
{
if(P[i]-'a'==j)F[i][j]=i+1;
else F[i][j]=F[f[i]][j];
}
} FOR(i,1,n+1)FOR(j,1,m+1)dp(i,j)=-1;
dp(1,1)=0;
FOR(i,1,n)FOR(j,1,m)if(~dp(i,j))
{
if(T[i]!='?')
{
int J=F[j][T[i]-'a'];
if(J==m+1)dp(i+1,f[J])=max(dp(i+1,f[J]),dp(i,j)+1);
else dp(i+1,J)=max(dp(i+1,J),dp(i,j));
}
else
{
FOR(k,0,25)
{
int J=F[j][k];
if(J==m+1)dp(i+1,f[J])=max(dp(i+1,f[J]),dp(i,j)+1);
else dp(i+1,J)=max(dp(i+1,J),dp(i,j));
}
}
}
int ans=0;
FOR(i,1,m)ans=max(ans,dp(n+1,i));
printf("%d\n",ans);
return 0;
}

Codeforces 808G Anthem of Berland(KMP+基础DP)的更多相关文章

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

    题目传送门 传送点I 传送点II 传送点III 题目大意 给定一个字符串$s$,和一个字符串$t$,$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】【DP】

    LINK 简要题意 给你一个串s,上面有字母和一些通配符,问你将通配符换成字母之后最多可以出现多少次串t 首先有一个很傻子的做法就是\(dp_{i,j}\)表示s到第i个位置匹配t串前j个字符的完整t ...

  4. Codeforces 219D. Choosing Capital for Treeland (树dp)

    题目链接:http://codeforces.com/contest/219/problem/D 树dp //#pragma comment(linker, "/STACK:10240000 ...

  5. 基础dp

    队友的建议,让我去学一学kuangbin的基础dp,在这里小小的整理总结一下吧. 首先我感觉自己还远远不够称为一个dp选手,一是这些题目还远不够,二是定义状态的经验不足.不过这些题目让我在一定程度上加 ...

  6. HDU 2087 剪花布条(KMP基础应用)

    KMP基础,注意输入 #include<cstdio> #include<cstring> #include<iostream> using namespace s ...

  7. 基础DP(初级版)

    本文主要内容为基础DP,内容来源为<算法导论>,总结不易,转载请注明出处. 后续会更新出kuanbin关于基础DP的题目...... 动态规划: 动态规划用于子问题重叠的情况,即不同的子问 ...

  8. hdu 5586 Sum 基础dp

    Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Desc ...

  9. hdu 4055 Number String (基础dp)

    Number String Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

随机推荐

  1. 解释器模式 Interpreter

    代码例子 参考 1.解释器模式定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 说明:解释器模式设计到文法规则和抽象语法树. 2.解释器模式的结构 ...

  2. new sh file

    创建新文件 sbash='#!/bin/bash' sauth='# auth: xiluhua' sdate="# date: $(date +%Y-%m-%d)" shead= ...

  3. nodejs typescript怎么发送get、post请求,如何获取网易云通信token

    nodejs typescript怎么发送get.post请求,如何获取网易云通信token yarn add jshashesyarn add superagent检查语法yarn lint==== ...

  4. LUHN 模10 算法 银行卡校验

    信用卡Luhn算法(模10)具体的校验过程如下: 1.从卡号最后一位数字开始,逆向将奇数位(1.3.5等等)相加. 2.从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去 ...

  5. jenkins1

    持续集成工具: Jenkins  和 Hudson是同源的. 甲骨文和开源社区之间的关系破裂,该项目被分成两个独立的项目. Jenkins:由大部分原始开发人员组成,Hudson:由甲骨文公司继续管理 ...

  6. CentOS7 重启网卡Failed to start LSB: Bring up/down networking.解决方法

    环境:MAC PD虚拟机安装centos7 修改完网卡配置,重启网络服务报错 使用提示命令查看:systemctl status network.service 发现报错为Failed to star ...

  7. Icarscan VCI is definitely the update variation of Start iDiag

    Start iCarScan is alternative of Super X431 iDiag, it’ll make your Android smartphone or tablet righ ...

  8. 重复打印相同内容(Doc档)的时候自动生成打印编号

    昨天突然接到一个好久未联系的朋友电话,说是江湖救急,要打印一份单据,单据上有个号码要自动生成,如下图,最土的办法是打印完一张,手工改下号码,但这种方法估计碰到成百上千张时估计会疯掉 网上找了实现方法, ...

  9. pat 团体赛练习题集 L2-008. 最长对称子串

    对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s&quo ...

  10. corn

    http://www.cnblogs.com/itech/archive/2011/02/09/1950226.html service crond start ---查看crontab服务是否启动 ...