热身训练2 Another Meaning
简要题意:
众所周知,在许多情况下,一个词语有两种意思。比如“hehe”,不仅意味着“hehe”,还意味着“excuse me”。
现在,某某在和妹纸在线聊天,妹纸发送了一个句子A给某某。某某很聪明,知道这个句子中的词语B有两种意思。他想知道妹纸有多少种可能想表达的意思。
分析:
我们令可替换意思的字符串为key,长度为length。
如果我们知道key在原字符串内的哪些地方出现过,即mk[起点]=1。
我们很容易想到一个dp式子
f[i]=f[i-1];
if(mk[i-length+1] == 1) f[i] += f[i-length];
现在,我们只需要能够快速滴求出mk数组即可
KMP!!!yyds!!!
先贴一个kmp的模板,其中la为主串的长度,lb为模式串的长度
for(re i=2, j=0;i<=lb;++i)
{
while(j && b[i] != b[j+1]) j=kmp[j];
if(b[j+1] == b[i]) j++;
kmp[i]=j;
}
for(re i=1, j=0;i<=la;++i)
{
while(j && b[j+1] != a[i]) j=kmp[j];
if(b[j+1] == a[i]) j++;
if(j == lb)
{
j=kmp[j];
mk[i-lb+1]=1;
}
}

kmp精髓:利用已经部分匹配这个有效信息,保持i指针不回溯,通过修改j指针,让模式串尽量地移动到有效的位置。
推荐大家去看一下这个有关kmp的博客!
好啦,这道题我们已经会切了哟!
总结一下:
1.我们用kmp,求出模式串在哪里出现过。
2.用dp推出情况总数。
#include<bits/stdc++.h>
using namespace std;
#define re register int
#define int long long
const int N=1e5+5, mo=1e9+7;
char a[N], b[N];
int la, lb, kmp[N], mk[N], f[N];
inline void work()
{
memset(mk, 0, sizeof(mk));
a[0]='\0';
b[0]='\0';
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
cin>>a+1;
cin>>b+1;
la = strlen(a+1);
lb = strlen(b+1);
for(re i=2, j=0;i<=lb;++i)
{
while(j && b[i] != b[j+1]) j=kmp[j];
if(b[j+1] == b[i]) j++;
kmp[i]=j;
}
for(re i=1, j=0;i<=la;++i)
{
while(j && b[j+1] != a[i]) j=kmp[j];
if(b[j+1] == a[i]) j++;
if(j == lb)
{
j=kmp[j];
mk[i-lb+1]=1;
}
}
f[0]=1;
for(re i=1;i<=la;++i)
{
f[i] = f[i-1];
if(i-lb >=0 && mk[i-lb+1])
{
f[i] = (f[i] + f[i-lb]) % mo;
}
}
cout<<f[la]<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
int T; cin>>T;
for(re i=1;i<=T;++i)
{
cout<<"Case #"<<i<<": ";
work();
}
return 0;
}
“我还是从前那个少年,没有一丝丝改变。”
“时间只不过是考验,种在心中信念丝毫未减。”----《少年》梦然
热身训练2 Another Meaning的更多相关文章
- 数位dp & 热身训练7
数位dp 数位dp是一种计数用的dp,一般就是要统计一段区间$[L,R]$内,满足一定条件的数的个数,或者各个数位的个数. 数位dp使得暴力枚举变为满足一定状态的记忆化,更加优秀. 数位dp常常会考虑 ...
- 热身训练4 Article
Article 在这个学期即将结束时,DRD开始写他的最后一篇文章. DRD使用著名的Macrohard的软件World来写他的文章. 不幸的是,这个软件相当不稳定,它总是崩溃. DRD需要在他的文章 ...
- 热身训练4 Eighty seven
Eighty seven 简要题意: n个卡片,其中第i个卡片的数值为$a[i]$.一共q次询问,每次询问将删去其中3个卡片(可能删除若干相同的卡片)后,问能否选出10个卡片,数值之和等于87. n≤ ...
- 热身训练2 The All-purpose Zero
The All-purpose Zero 简要题意: 长度为n的数组,每个数字为S[i],$0$是一种很神奇的数字,你想要的,它都可以变! 问这个序列的最长上升子序列长度为多少? 分析: 我们将除了 ...
- 热身训练3 Palindrome
Palindrome 简要题意: 我们有一个字符串S,字符串的长度不超过500000. 求满足S[i]=S[2n−i]=S[2n+i−2](1≤i≤n)(n≥2)的子串个数. 分析: 我们能通过简 ...
- 热身训练2 GCD
题目描述 简要题意: n个数字,a1,a2,...,an m次询问(l,r),每次询问需回答 1.gcd(al,al+1,al+2,...,ar);2.gcd(ax,ax+1,ax+2,...,ay ...
- 热身训练1 Calculator
题目出处:Calculator 简要题意: 你有一个确定的函数,f(x)=+...*...^...,其中共有n个操作,从左到右依次计算. 共有m次询问,我们每次询问,1.会修改f(x)中的操作:2.输 ...
- 热身训练1 ping ping ping
点此进入 题意: 一棵树,n+1 个节点,以0号节点为根,给出端点(a,b),节点a到节点b的路径上,至少有一个点是"坏掉的",求"坏掉的点"最少 分析: St ...
- 热身训练1 Problem B. Harvest of Apples
http://acm.hdu.edu.cn/showproblem.php?pid=6333 题意: 求 C(0,n)+C(1,n)+...+C(m,n) 分析: 这道题,我们令s(m,n) = C( ...
随机推荐
- Jsoup快速查询
一.selector选择器 二.Xpath查询
- 硕盟SM-H2V1 HDMI转VGA 笔记本台式主机HDMI转VGA显示器转接头
硕盟SM-G2V1 HDMI转VGA高清转换器一款采用优质芯片的HDMI转VGA转换器,快速传输众享1080P的高清画质显示,而且HDMI转VGA高清转换器,采用24k镀金工艺,耐磨.耐腐蚀性强,这 ...
- Java-SpringBoot整合SpringCloud
SpringBoot整合SpringCloud 1. SpringCloud特点 SpringCloud专注于为典型的用例和扩展机制提供良好的开箱即用体验,以涵盖其他情况: 分布式/版本化配置 服务注 ...
- 《手把手教你》系列技巧篇(二十六)-java+ selenium自动化测试-浏览器操作(详细教程)
1.简介 在Web自动化的操作中,我们通常需要使用一些方法来操作浏览器,今天就来学习一下.这一篇宏哥主要是介绍一下,在自动化测试的时候,我们常见的一些浏览器操作有哪些,宏哥将会一一介绍和讲解. 2.浏 ...
- 5.10学习总结——Activity的跳转和传值
使用sharedpreference是对信息的存储,也可以进行传值,今天通过查找资料,学习了Activity的跳转和传值方法. 跳转 1.显示跳转 4种方法 1 2 3 4 5 6 7 8 9 10 ...
- Django学习day15BBS项目开发3.0
每日测验 """ 今日考题 1.django admin作用及用法 2.media配置如何实现,基于该配置能够做到什么以及需要注意什么 3.阐述博客园为何支持用户自定义个 ...
- linux停止nginx服务 未成功
在上线新功能的时候,需要将服务器停掉,防止在更新过程中有用户进行操作额外的数据. 1:查看nginx主进程: ps -ef | grep nginx 这里root 后面的数字表示:主进程号nginx后 ...
- [源码解析] PyTorch 流水线并行实现 (2)--如何划分模型
[源码解析] PyTorch 流水线并行实现 (2)--如何划分模型 目录 [源码解析] PyTorch 流水线并行实现 (2)--如何划分模型 0x00 摘要 0x01 问题 0x01 自动平衡 1 ...
- sonar扫面代码总体流程
- P3306-[SDOI2013]随机数生成器【BSGS】
正题 题目链接:https://www.luogu.com.cn/problem/P3306 题目大意 给出一个\(p,a,b,x_1,t\),有\(x_i=ax_{i-1}+b\) 求一个最小的\( ...