题目来源

简要题意:

众所周知,在许多情况下,一个词语有两种意思。比如“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. mysql远程连接以及错误解决&命令行基本操作

    现在大家的程序服务基本都是部署在云服务器上,今天我分享记录一下:使用mysql数据库过程中比较常见操作和遇到的问题 环境:lunix 系统(阿里云服务器,华为云服务器,腾讯云等均适用) + mysql ...

  2. [第七篇]——Docker Hello World之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker Hello World Docker 允许你在容器内运行应用程序, 使用  docker run 命令来在容器内运行一个应用程序. 输出Hello world xxx@xxx:~$ do ...

  3. Nginx总结(九)Nginx服务器高性能优化的配置--轻松实现10万并发访问量

    前面讲了如何配置Nginx虚拟主机,如何配置服务日志等很多基础的内容,大家可以去这里看看nginx系列文章:https://www.cnblogs.com/zhangweizhong/category ...

  4. java循环结构、数组

    数组 数组是是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理. 数组本身是引用数据类型,既可以存储基本数据类型,也可以存储引用数据类型.它的元素相当于 ...

  5. 学习PHP中的iconv扩展相关函数

    想必 iconv 这个扩展的相关函数大家多少都接触过,做为 PHP 的默认扩展它已经存在了很久,也是我们在操作字符编码时经常会使用的函数.不过除了 iconv() 这个函数外,你还知道它的其它函数吗? ...

  6. Hadoop-3.1.3安装

    0.创建用户并付权限 sudo useradd iwbdsudo passwd iwbd 配置iwbd用户具有root权限 修改/etc/sudoers文件,找到下面一行(91行),在root下面添加 ...

  7. Linux系列(21) - 光盘、U盘挂载

    挂载光盘 mount命令.umount命令 step-1 建立挂载点 原理:相当于建立盘符,建个目录读取光盘内容 命令:[root@localhost ~]# mkdir /mnt/cdrom/ 备注 ...

  8. gin 源码阅读(1) - gin 与 net/http 的关系

    gin 是目前 Go 里面使用最广泛的框架之一了,弄清楚 gin 框架的原理,有助于我们更好的使用 gin. 这个系列 gin 源码阅读会逐步讲明白 gin 的原理. gin 概览 想弄清楚 gin, ...

  9. contos 7修改root密码

    https://www.linuxidc.com/Linux/2018-01/150211.htm 下面是CentOS 7的root密码修改 开机按esc 选择CentOS Linux (3.10.0 ...

  10. python学习笔记(十五)-异常处理

    money = input('输入多少钱:') months = input('还几个月:') try: res = calc(int(money),int(months)) except ZeroD ...