题目来源

简要题意:

众所周知,在许多情况下,一个词语有两种意思。比如“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的更多相关文章

  1. 数位dp & 热身训练7

    数位dp 数位dp是一种计数用的dp,一般就是要统计一段区间$[L,R]$内,满足一定条件的数的个数,或者各个数位的个数. 数位dp使得暴力枚举变为满足一定状态的记忆化,更加优秀. 数位dp常常会考虑 ...

  2. 热身训练4 Article

    Article 在这个学期即将结束时,DRD开始写他的最后一篇文章. DRD使用著名的Macrohard的软件World来写他的文章. 不幸的是,这个软件相当不稳定,它总是崩溃. DRD需要在他的文章 ...

  3. 热身训练4 Eighty seven

    Eighty seven 简要题意: n个卡片,其中第i个卡片的数值为$a[i]$.一共q次询问,每次询问将删去其中3个卡片(可能删除若干相同的卡片)后,问能否选出10个卡片,数值之和等于87. n≤ ...

  4. 热身训练2 The All-purpose Zero

    The All-purpose Zero 简要题意:  长度为n的数组,每个数字为S[i],$0$是一种很神奇的数字,你想要的,它都可以变! 问这个序列的最长上升子序列长度为多少? 分析: 我们将除了 ...

  5. 热身训练3 Palindrome

    Palindrome 简要题意:  我们有一个字符串S,字符串的长度不超过500000. 求满足S[i]=S[2n−i]=S[2n+i−2](1≤i≤n)(n≥2)的子串个数.  分析: 我们能通过简 ...

  6. 热身训练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 ...

  7. 热身训练1 Calculator

    题目出处:Calculator 简要题意: 你有一个确定的函数,f(x)=+...*...^...,其中共有n个操作,从左到右依次计算. 共有m次询问,我们每次询问,1.会修改f(x)中的操作:2.输 ...

  8. 热身训练1 ping ping ping

    点此进入 题意: 一棵树,n+1 个节点,以0号节点为根,给出端点(a,b),节点a到节点b的路径上,至少有一个点是"坏掉的",求"坏掉的点"最少 分析: St ...

  9. 热身训练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( ...

随机推荐

  1. Element 对话框简单使用

    官方文档介绍的是页内对话框,但没有基于组件的对话框,这里记录一下,原理就是父子传值是否显示 父页导入组件 <template> <div class="home" ...

  2. 这些解决 Bug 的套路,你都会了不?

    最近整理了我原创的 140 篇编程经验和技术文章,欢迎大家阅读,一起成长!指路:https://t.1yb.co/ARnD 大家好,我是鱼皮. 学编程的过程中,我们会遇到各式各样的 Bug,也常常因为 ...

  3. ysoserial CommonsColletions3分析(1)

    CC3的利用链在JDK8u71版本以后是无法使用的,具体还是由于AnnotationInvocationHandler的readobject进行了改写. 而CC3目前有两条主流的利用链,利用Trans ...

  4. css3 图片变黑白 filter

    /*图片黑白*/ .img-gray { -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: gray ...

  5. composer install 出现 RuntimeException Failed to execute

    报错:composer.json 的  require添加新包 需要删除composer.lock和vender 从新composer install [RuntimeException] Faile ...

  6. Object of type type is not JSON serializable

    报这个错的原因是因为json.dumps函数发现字典里面有bytes类型的数据,无法编码.解决方法:将bytes类型的数据就把它转化成str类型. 定义dates[]后return JsonRespo ...

  7. 51nod1600-Simple KMP【SAM,树链剖分】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1600 题目大意 给出一个字符串\(s\),每次在最后插入一个字符后求它的 ...

  8. vue+element实现省区市三级联动以及详细地址的输入

    Vue+elementui实现省区市三级联动+详细地址的输入 详细需求,需要手动更改用户所在的地址. 安装依赖项 npm install element-china-area-data -S 在组建中 ...

  9. IDEA破解方法:重新刷新到30天【支持正版】

    IDEA破解方法:重新刷新到30天[支持正版] 步骤: 导入plugins.zhile.io 进入File-->Settings-->Plugins 点设置(齿轮符号)-->Mana ...

  10. 解决Vite-React项目中js使用jsx语法报错的问题

    背景 在做存量项目接入Vite测试时发现,存量(老)项目中很多是直接在js中书写jsx语法,使用Vite启动时就会抛出一堆问题Failed to parse source. 不嫌麻烦可以跑个脚本批量修 ...