热身训练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( ...
随机推荐
- Apache网页优化
目录: 一.Apache网页优化概述 二.网页压缩 三.网页缓存 四.隐藏版本信息 五.Apache防盗链 一.Apache网页优化概述 在企业中,部署Apache后只采用默认的配置参数,会引发网站很 ...
- weblogic漏洞分析之CVE-2017-10271
weblogic漏洞分析之CVE-2017-10271 一.环境搭建 1)配置docker 这里使用vulhub的环境:CVE-2017-10271 编辑docker-compose.yml文件,加入 ...
- 383 day10缓冲流、转换流、序列化流
day10[缓冲流.转换流.序列化流] 主要内容 缓冲流 转换流 序列化流 打印流 教学目标 [ ] 能够使用字节缓冲流读取数据到程序 [ ] 能够使用字节缓冲流写出数据到文件 [ ] 能够明确字符缓 ...
- POJ1804——Brainman(水题)
解题思路: 一个乱序序列的 逆序数 = 在只允许相邻两个元素交换的条件下,得到有序序列的交换次数 直接求逆序数 把S[i]和s[i+1~n]的元素逐个比较,如果s[i] > s[k] (k∈[i ...
- PHP中的PDO操作学习(四)查询结构集
关于 PDO 的最后一篇文章,我们就以查询结果集的操作为结束.在数据库的操作中,查询往往占的比例非常高.在日常的开发中,大部分的业务都是读多写少型的业务,所以掌握好查询相关的操作是我们学习的重要内容. ...
- PHP的HTTP验证
在日常开发中,我们进行用户登录的时候,大部分情况下都会使用 session 来保存用户登录信息,并以此为依据判断用户是否已登录.但其实 HTTP 也提供了这种登录验证机制,我们今天就来学习关于 HTT ...
- PolarDB PostgreSQL Buffer Management 原理
背景介绍 传统数据库的主备架构,主备有各自的存储,备节点回放WAL日志并读写自己的存储,主备节点在存储层没有耦合.PolarDB的实现是基于共享存储的一写多读架构,主备使用共享存储中的一份数据.读写节 ...
- P5325-[模板]Min_25筛
正题 题目链接:https://www.luogu.com.cn/problem/P5325 题目大意 定义一个积性函数满足\(f(p^k)=p^k(p^k-1)\) 求\(\sum_{i=1}^nf ...
- CF710F-String Set Queries【AC自动机,二进制分组】
正题 题目链接:https://www.luogu.com.cn/problem/CF710F 题目大意 \(T\)次操作 往集合中加入一个字符串 往集合中删除一个字符串 给出一个模式串求出现的集合里 ...
- 【DP】Educational DP Contest
这份 dp 题单的最后几题好难 orz. 前面的题比较简单,所以我会选取一些题来讲,其它的直接看代码理解吧 qwq. 传送门: https://atcoder.jp/contests/dp 全部 AC ...