CodeForces - 1051E :Vasya and Big Integers(Z算法 & DP )
题意:给定字符串S,A,B。现在让你对S进行切割,使得每个切割出来的部分在[A,B]范围内,问方案数。
思路:有方程,dp[i]=Σ dp[j] (S[j+1,i]在合法范围内)。 假设M和N的最长公共前缀为长度是LCP,那么字符串M>=字符串N的条件是 LCP=|N|或者(LCP<|N|&&M[lcp+1]>N[lca+1]); 小于同理。 求出范围就可以用前缀和 O(N)求DP了。
而LCP显然可以用exkmp求。 最近发现Z算法比较好写。 尝试了一下。 这里把两个串连起来一次性求,看起来比较舒服。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int Mod=;
char s[maxn<<],l[maxn],r[maxn];
int z1[maxn],z2[maxn],lena,lenl,lenr;
void Z(char a[],char t[],int z[])
{
int f=strlen(a+),w=strlen(t+);
a[f+]='&'; rep(i,,w) a[f++i]=t[i]; int n=f+w+;
z[]=n; int L=,R=;
rep(i,,n) {
if(R<i) z[i]=;
else z[i]=min(R-i+,z[i-L+]);
while(i+z[i]<=n&&a[i+z[i]]==a[z[i]+]) z[i]++;
if(i+z[i]->R) L=i,R=i+z[i]-;
}
rep(i,,w) z[i]=z[f++i];
}
int dp[maxn],sum[maxn];
int main()
{
scanf("%s%s%s",s+,l+,r+);
lena=strlen(s+); lenl=strlen(l+); lenr=strlen(r+);
Z(l,s,z1); Z(r,s,z2);
dp[lena+]=sum[lena+]=;
for(int i=lena;i>=;i--) {
sum[i]=sum[i+];
if(s[i]=='') dp[i]=(l[]=='')*dp[i+],sum[i]=(sum[i]+dp[i])%Mod;
else {
int L=i+lenl,R=min(i+lenr-,lena);
if(z1[i]==lenl||s[i+z1[i]]>l[z1[i]+]) L--;
if(R<lena&&(z2[i]==lenr||s[i+z2[i]]<r[z2[i]+])) R++;
if(L<=R) dp[i]=(sum[L+]-sum[R+]+Mod)%Mod,sum[i]=(sum[i]+dp[i])%Mod;
}
}
printf("%d\n",dp[]);
return ;
}
CodeForces - 1051E :Vasya and Big Integers(Z算法 & DP )的更多相关文章
- Codeforces 1051E Vasya and Big Integers&1051F The Shortest Statement
1051E. Vasya and Big Integers 题意 给出三个大整数\(a,l,r\),定义\(a\)的一种合法的拆分为把\(a\)表示成若干个字符串首位相连,且每个字符串的大小在\(l, ...
- Codeforces 1051E. Vasya and Big Integers
题意:给你N个点M条边,M-N<=20,有1e5个询问,询问两点的最短距离.保证没有自环和重边. 题解:连题目都在提示你这个20很有用,所以如果是颗树的话那任意两点的最短距离就是求一下lca搞一 ...
- Codeforces 126B Password(Z算法)
题意 给定一个字符串 \(s\) ,求一个子串 \(t\) 满足 \(t\) 是 \(s\) 的前缀.后缀且在除前缀后缀之外的地方出现过. \(1 \leq |s| \leq 10^6\) 思路 \( ...
- Z算法
Z算法 Z算法是一种用于字符串匹配的算法.此算法的核心在于\(z\)数组以及它的求法. (以下约定字符串下标从\(1\)开始) \(\bm z\)数组和Z-box 定义\(z\)数组:\(z_{a,i ...
- 【算法】字符串匹配之Z算法
求文本与单模式串匹配,通常会使用KMP算法.后来接触到了Z算法,感觉Z算法也相当精妙.在以前的博文中也有过用Z算法来解决字符串匹配的题目. 下面介绍一下Z算法. 先一句话讲清楚Z算法能求什么东西. 输 ...
- Z算法板子
给定一个串$s$, $Z$算法可以$O(n)$时间求出一个$z$数组 $z_i$表示$s[i...n]$与$s$的前缀匹配的最长长度, 下标从$0$开始 void init(char *s, int ...
- CodeForces - 837E - Vasya's Function | Educational Codeforces Round 26
/* CodeForces - 837E - Vasya's Function [ 数论 ] | Educational Codeforces Round 26 题意: f(a, 0) = 0; f( ...
- Codeforces Round #174 (Div. 1) B. Cow Program(dp + 记忆化)
题目链接:http://codeforces.com/contest/283/problem/B 思路: dp[now][flag]表示现在在位置now,flag表示是接下来要做的步骤,然后根据题意记 ...
- Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题
除非特别忙,我接下来会尽可能翻译我做的每道CF题的题面! Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题 题面 胡小兔和司公子都认为对方是垃圾. 为了决出谁才是垃 ...
随机推荐
- 【07月01日】A股滚动市净率PB历史新低排名
2010年01月01日 到 2019年07月01日 之间,滚动市净率历史新低排名. 上市三年以上的公司,2019年07月01日市净率在30以下的公司. 来源:A股滚动市净率(PB)历史新低排名. 1 ...
- Jenkins+Docker+Git+Registry
从0到1体验Jenkins+Docker+Git+Registry实现CI自动化发布 笔者:@拿着保温瓶的年轻人 目录: 一.前言 二.发布流程 三.环境准备 四.部署思路梳理 五.三台机器上操作 ...
- Matlab 整数线性规划问题模型代码
整数线性规划问题的基本内容 整数线性规划解决的是自变量在一定的线性约束条件下,使得线性目标函数求得最大值或者最小值的问题.其中自变量只能取整数.特别地,当自变量只能取0或者1时,称之为 0-1 整数规 ...
- [转帖]IBM Q3财报:云营收达到50亿美元 上升11%
IBM Q3财报:云营收达到50亿美元 上升11% http://www.eetop.cn/cpu_soc/6946136.html 2019年Q3 IBM的营收 从千亿到 缩减到了 八百亿刀 卖掉了 ...
- 【转】Mac入门(一)基本用法
我前五年一直外包到微软,每天使用的都是Windows系统和.NET. 2012年加入VMware, 公司的工作机是台Mac 笔记本(MacBook Pro), 所以有机会接触Mac系统 Mac和Wi ...
- C#读写修改设置调整UVC摄像头画面-伽玛
有时,我们需要在C#代码中对摄像头的伽玛进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄像 ...
- [08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up IDEA2019的database插件无法链接mysql的解决办法(08001错误)
[08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up. 点击这里 ...
- CentOS 7 - 安装Python 3
Enable Software Collections (SCL) Software Collections, also known as SCL is a community project tha ...
- android中fragment卡顿的原因
首页的ViewPager有十几个Fragment,在快速切换的时候,容易产生卡顿现象. 二.分析当ViewPager切换到当前的Fragment时,Fragment会加载布局并显示内容,如果用户这时快 ...
- http://www.jb51.net/article/51934.htm
这篇文章主要介绍了mysql优化limit查询语句的5个方法,它们分别是子查询优化法.倒排表优化法.反向查找优化法.limit限制优化法和只查索引法,需要的朋友可以参考下 mysql的分页比较简单 ...