热身训练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( ...
随机推荐
- Swagger-初见
目录 Swagger简介 SpringBoot集成Swagger 配置Swagger 配置扫描接口 配置Swagger开关 配置API分组 实体配置 常用注解 Swagger简介 前后端分离 前端 - ...
- 海量列式非关系数据库HBase 原理深入
HBase读数据流程: 前置关键词描述: Block Cache :读缓存,缓存上一次读的数据,整个ReginServer只有一个 MemStore :写缓存,缓存上一次写的数据,每个Store有一个 ...
- Spring5(五)——AOP
一.AOP 1.介绍 AOP(Aspect Oriented Programming),面向切面编程.它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共 ...
- xxl-job <=2.0.2 反序列化漏洞
xxl-job <=2.0.2 反序列化漏洞 搭建 https://github.com/xuxueli/xxl-job/releases/tag/2.0.2 下载源码,导入idea,mysql ...
- Java定时任务Quartz
第一步:pom文件中添加依赖包 第二步:创建xml文件,名称为:spring-scheduler 路径如下图: 第三步:spring-scheduler配置详情 <!--创建任务--> & ...
- 【PHP数据结构】散列表查找
上篇文章的查找是不是有意犹未尽的感觉呢?因为我们是真真正正地接触到了时间复杂度的优化.从线性查找的 O(n) 直接优化到了折半查找的 O(logN) ,绝对是一个质的飞跃.但是,我们的折半查找最核心的 ...
- ecshop调用指定分类热销-新品-精品
在模板页里首页写上代码: <?php$children = get_children(16);//此处为产品分类ID$smarty->assign( 'bestGoods1 ...
- java面向对象编程(上)
java面向对象学习的三条主线 1.Java类及类的成员:属性.方法.构造器.代码块.内部类 2.面向对象的三大特征:封装性.继承性.多态性.(抽象性) 3.其它关键字:this.super.stat ...
- $.ajax 常用的套路
$.ajax 常用的套路 (function(){ window.webApi = new Object(); webApi.get = function(url,data,callback){ $. ...
- 我在学习Blazor当中踩的巨坑!Blazor WebAssembly调试
最近嘛,看看Blazor已经蛮成熟的.顺便想在自家的框架里使用这个东西,毕竟我还是很念旧的,而且Blazor的技术栈也不麻烦.然后呢,在调试这一关我可是踩了大坑. 我的VS是2019,很早以前装的.然 ...