[CF1051E Vasya and Big Integers](Problem - E - Codeforces)

sb的做法

单调队列乱整(

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+5,MOD=998244353;
int n,len1,len2;
string s,l,r;
int q[N],st=1,ed,us=1;
bool ck_l(string t){
if(t.size()<l.size()) return true;
if(t.size()>l.size()) return false;
return t<l;
}
bool ck_r(string t){
if(t.size()<r.size()) return false;
if(t.size()>r.size()) return true;
return t>r;
}
bool check(int st,int ed){
string t=s.substr(st,ed-st+1);
// cout<<st<<" "<<ed<<" "<<t<<" "<<((t<l)?1:0)<<" "<<((t>r)?1:0)<<" "<<((t[0]=='0')?1:0)<<endl;
return ck_l(t)||ck_r(t)||(t[0]=='0'&&st!=ed);
}
ll dp[N],sum=1;
int main(){
char t;
cin>>s,cin>>l,cin>>r;
// cout<<"\n-------"<<r<<"------"<<endl;
s='#'+s;
n=s.size()-1,dp[0]=1;
for(int i=1;i<=n;++i){
q[++ed]=i;
while(st<=ed&&check(q[st],i)) (sum+=-dp[q[st]-1]+MOD)%=MOD,++st;
if(st>ed) return printf("0"),0;
while(us<ed&&us<st) ++us,(sum+=dp[q[us]-1])%=MOD;
while(us+1<=ed&&!check(q[us+1],i)) ++us,(sum+=dp[q[us]-1])%=MOD; dp[i]=sum;
// cout<<i<<" "<<st<<" "<<us<<" "<<ed<<" "<<dp[i]<<endl;
}
printf("%lld\n",dp[n]);
return 0;
}

大概思路:

用一个单调队列来维护当前可以选择用来当最后一段的开头的所有下标

然后因为新加的点不一定能马上用到(因为有下限),所以除了sted外还有us

区间[st,us]就是可以用的下标

不过这是戳的,下辈子有空再弄吧。。。

正解

算出slr的\(extend\),然后就可以进行\(DP\)了

在\(DP\)中,算出可以转移到i的下标取值范围\([l1,r1]\)

可以先得出一个大概的范围:\([i+len_l-1,i+len_r-1]\),因为当前划分出来的字符串的长度的范围为[len1,len2]

倒着\(DP\),\(dp[i]\)表示以i开头有多少种划分方式

然后如果\(s\)与\(l\)不相等的第一个位置上,\(l\)较大,则说明当前划分出来的字符串的长度至少为\(len_l+1\);如果\(s\)与\(l\)不相等的第一个位置上,\(r\)较小,则说明当前划分出来的字符串的长度最大为\(len_r-1\)

然后前缀和优化,这道题就G了

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+5,MOD=998244353;
int n,len1,len2,nxt1[N],nxt2[N],extend1[N],extend2[N];
char s[N],l[N],r[N];
void exkmp(char s[],int n,int nxt[]){
nxt[1]=n;
for(int i=2,a=0,p=0;i<=n;++i){
if(i<p) nxt[i]=min(nxt[i-a+1],p-i);
while(i+nxt[i]<=n&&s[nxt[i]+1]==s[i+nxt[i]]) ++nxt[i];
if(i+nxt[i]>p) p=i+nxt[i],a=i;
}
}
void ekp(char s[],char t[],int n,int m,int nxt[],int extend[]){
for(int i=1,a=0,p=0;i<=n;++i){
if(i<p) extend[i]=min(nxt[i-a+1],p-i);
while(i+extend[i]<=n&&extend[i]+1<=m&&s[i+extend[i]]==t[extend[i]+1]) ++extend[i];
if(i+extend[i]>p) p=i+extend[i],a=i;
}
}
ll dp[N],sum[N];
int main(){
scanf("%s\n%s\n%s",s+1,l+1,r+1);
n=strlen(s+1),len1=strlen(l+1),len2=strlen(r+1);
exkmp(l,len1,nxt1),exkmp(r,len2,nxt2);
ekp(s,l,n,len1,nxt1,extend1),ekp(s,r,n,len2,nxt2,extend2);
sum[n+1]=dp[n+1]=1;
for(int i=n;i;--i){
if(s[i]=='0') dp[i]=(l[1]=='0')*dp[i+1];
else{
int l1=i+len1-1,r1=i+len2-1;
if(extend1[i]<len1&&l[extend1[i]+1]>s[i+extend1[i]]) ++l1;
if(extend2[i]<len2&&r[extend2[i]+1]<s[i+extend2[i]]) --r1;
r1=min(r1,n);
if(l1>r1) dp[i]=0;
else dp[i]=((sum[l1+1]-sum[r1+2])%MOD+MOD)%MOD;
}
sum[i]=(dp[i]+sum[i+1])%MOD;
}
printf("%lld",dp[1]);
return 0;
}

CF1051E Vasya and Big Integers的更多相关文章

  1. Codeforces 1051E Vasya and Big Integers&1051F The Shortest Statement

    1051E. Vasya and Big Integers 题意 给出三个大整数\(a,l,r\),定义\(a\)的一种合法的拆分为把\(a\)表示成若干个字符串首位相连,且每个字符串的大小在\(l, ...

  2. Codeforces 1051E. Vasya and Big Integers

    题意:给你N个点M条边,M-N<=20,有1e5个询问,询问两点的最短距离.保证没有自环和重边. 题解:连题目都在提示你这个20很有用,所以如果是颗树的话那任意两点的最短距离就是求一下lca搞一 ...

  3. CF_EDU51 E. Vasya and Big Integers

    传送门:https://codeforces.com/contest/1051/problem/E 题意: 把一个数分成许多小段,每一段的值在L和R间.问有多少种分法. 思路 : 首先,需要快速处理出 ...

  4. CodeForces - 1051E :Vasya and Big Integers(Z算法 & DP )

    题意:给定字符串S,A,B.现在让你对S进行切割,使得每个切割出来的部分在[A,B]范围内,问方案数. 思路:有方程,dp[i]=Σ dp[j]   (S[j+1,i]在合法范围内).    假设M和 ...

  5. ExKMP(Z Algorithm) 讲解

    目录 问题引入 CaiOJ 1461 [EXKMP]最长共同前缀长度 算法讲解 匹配过程 next 的求解 复杂度证明 代码解决 一些例题 UOJ #5. [NOI2014]动物园 CF1051E V ...

  6. 2018SDIBT_国庆个人第一场

    A - Turn the Rectangles CodeForces - 1008B There are nn rectangles in a row. You can either turn eac ...

  7. 2018.9.20 Educational Codeforces Round 51

    蒟蒻就切了四道水题,然后EF看着可写然而并不会,中间还WA了一次,我太菜了.jpg =.= A.Vasya And Password 一开始看着有点虚没敢立刻写,后来写完第二题发现可以暴力讨论,因为保 ...

  8. CF 1008C Reorder the Array

    You are given an array of integers. Vasya can permute (change order) its integers. He wants to do it ...

  9. DP 题集 2

    关于 DP 的一些题目 String painter 先区间 DP,\(dp[l][r]\) 表示把一个空串涂成 \(t[l,r]\) 这个子串的最小花费.再考虑 \(s\) 字符串,\(f[i]\) ...

  10. CodeForces Educational Codeforces Round 51 (Rated for Div. 2)

    A:Vasya And Password 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen(&q ...

随机推荐

  1. Centos镜像下载

    1.进入官网,并点击下图所示的红框(alternative downloads) 官网网址:https://www.centos.org/download/  2.在往下翻,可以看到如下图的历史版本, ...

  2. 为什么 softmax 计算时要先减去最大值

    根据 softmax 最基本的定义,计算公式如下所示: $$S_i=\frac{e^{x_i}}{\sum_j e^{x_j}}$$ 原理也很简单,将原向量变为分布的形式(和为1). 看似很美好,但是 ...

  3. 记录一次Oracle导入数据库失败的解决办法,最终报错:UDI-04045、ORA-04045、ORA-01775

    费了很大的工夫,终于解决了.做个记录. ******************************************************************************** ...

  4. 解决头部使用 position:fixed; 固定定位后遮住下方内容的问题

    1.在头部下面给一个空的 div 给这个div设置高度,把页面撑开,这种方法是让头部刚好遮住的是这个空div,把内容放出来. 但是这种方法需要一点点调试高度,所以不推荐. 2.把整个要使用 posit ...

  5. CSP-S2022 游寄

    前言:最后确实寄了,因为疫情,都没考成. \(8.26\) 占坑. \(8.23\) 参加浴谷月赛初赛模拟,报的 \(S\) 组,只有 \(71\) 分. \(8.25\) \(AK\) 了同学出的比 ...

  6. NOI2011真题:兔兔与蛋蛋游戏

    NOI2011真题:兔兔与蛋蛋游戏 题目描述 这些天,兔兔和蛋蛋喜欢上了一种新的棋类游戏. 这个游戏是在一个 n行 m 列的棋盘上进行的.游戏开始之前,棋盘上有一个格子是空的,其它的格子中都放置了一枚 ...

  7. mybatis sql批量插入

    insert into jrqf_officialcard (id, budget_unit, money_purpose, economic_type, money, func_subject_na ...

  8. 私藏!资深数据专家SQL效率优化技巧 ⛵

    作者:韩信子@ShowMeAI 数据分析实战系列:https://www.showmeai.tech/tutorials/40 本文地址:https://www.showmeai.tech/artic ...

  9. 视频超分之BasicVSR-阅读笔记

    1.介绍 对于视频超分提出了很多方法,EDVR中采用了多尺度可变形对齐模块和多个注意层进行对齐和定位并且从不同的帧聚合特征,在RBPN中,多个投影模块用于顺序聚合多个帧中的特征.这样的设计是有效的,但 ...

  10. 【每日一题】【DFS】2022年1月5日-543. 二叉树的直径

    给定一棵二叉树,你需要计算它的直径长度.一棵二叉树的直径长度是任意两个结点路径长度中的最大值.这条路径可能穿过也可能不穿过根结点. 答案: /** * Definition for a binary ...