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

sb的做法

单调队列乱整(

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N=1e6+5,MOD=998244353;
  5. int n,len1,len2;
  6. string s,l,r;
  7. int q[N],st=1,ed,us=1;
  8. bool ck_l(string t){
  9. if(t.size()<l.size()) return true;
  10. if(t.size()>l.size()) return false;
  11. return t<l;
  12. }
  13. bool ck_r(string t){
  14. if(t.size()<r.size()) return false;
  15. if(t.size()>r.size()) return true;
  16. return t>r;
  17. }
  18. bool check(int st,int ed){
  19. string t=s.substr(st,ed-st+1);
  20. // cout<<st<<" "<<ed<<" "<<t<<" "<<((t<l)?1:0)<<" "<<((t>r)?1:0)<<" "<<((t[0]=='0')?1:0)<<endl;
  21. return ck_l(t)||ck_r(t)||(t[0]=='0'&&st!=ed);
  22. }
  23. ll dp[N],sum=1;
  24. int main(){
  25. char t;
  26. cin>>s,cin>>l,cin>>r;
  27. // cout<<"\n-------"<<r<<"------"<<endl;
  28. s='#'+s;
  29. n=s.size()-1,dp[0]=1;
  30. for(int i=1;i<=n;++i){
  31. q[++ed]=i;
  32. while(st<=ed&&check(q[st],i)) (sum+=-dp[q[st]-1]+MOD)%=MOD,++st;
  33. if(st>ed) return printf("0"),0;
  34. while(us<ed&&us<st) ++us,(sum+=dp[q[us]-1])%=MOD;
  35. while(us+1<=ed&&!check(q[us+1],i)) ++us,(sum+=dp[q[us]-1])%=MOD;
  36. dp[i]=sum;
  37. // cout<<i<<" "<<st<<" "<<us<<" "<<ed<<" "<<dp[i]<<endl;
  38. }
  39. printf("%lld\n",dp[n]);
  40. return 0;
  41. }

大概思路:

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

然后因为新加的点不一定能马上用到(因为有下限),所以除了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了

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N=1e6+5,MOD=998244353;
  5. int n,len1,len2,nxt1[N],nxt2[N],extend1[N],extend2[N];
  6. char s[N],l[N],r[N];
  7. void exkmp(char s[],int n,int nxt[]){
  8. nxt[1]=n;
  9. for(int i=2,a=0,p=0;i<=n;++i){
  10. if(i<p) nxt[i]=min(nxt[i-a+1],p-i);
  11. while(i+nxt[i]<=n&&s[nxt[i]+1]==s[i+nxt[i]]) ++nxt[i];
  12. if(i+nxt[i]>p) p=i+nxt[i],a=i;
  13. }
  14. }
  15. void ekp(char s[],char t[],int n,int m,int nxt[],int extend[]){
  16. for(int i=1,a=0,p=0;i<=n;++i){
  17. if(i<p) extend[i]=min(nxt[i-a+1],p-i);
  18. while(i+extend[i]<=n&&extend[i]+1<=m&&s[i+extend[i]]==t[extend[i]+1]) ++extend[i];
  19. if(i+extend[i]>p) p=i+extend[i],a=i;
  20. }
  21. }
  22. ll dp[N],sum[N];
  23. int main(){
  24. scanf("%s\n%s\n%s",s+1,l+1,r+1);
  25. n=strlen(s+1),len1=strlen(l+1),len2=strlen(r+1);
  26. exkmp(l,len1,nxt1),exkmp(r,len2,nxt2);
  27. ekp(s,l,n,len1,nxt1,extend1),ekp(s,r,n,len2,nxt2,extend2);
  28. sum[n+1]=dp[n+1]=1;
  29. for(int i=n;i;--i){
  30. if(s[i]=='0') dp[i]=(l[1]=='0')*dp[i+1];
  31. else{
  32. int l1=i+len1-1,r1=i+len2-1;
  33. if(extend1[i]<len1&&l[extend1[i]+1]>s[i+extend1[i]]) ++l1;
  34. if(extend2[i]<len2&&r[extend2[i]+1]<s[i+extend2[i]]) --r1;
  35. r1=min(r1,n);
  36. if(l1>r1) dp[i]=0;
  37. else dp[i]=((sum[l1+1]-sum[r1+2])%MOD+MOD)%MOD;
  38. }
  39. sum[i]=(dp[i]+sum[i+1])%MOD;
  40. }
  41. printf("%lld",dp[1]);
  42. return 0;
  43. }

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. Unity——射线检测(鼠标点击开关门效果)

    Unity射线检测--实现简单的开关门效果 简要:通过鼠标点击来发射一条射线,来获得射线所碰到的物体名称,再通过改变门的Rotation值来实现开关门的效果. 一.代码实现 1.1 简易的场景搭建 注 ...

  2. pod(五):pod hook(pod钩子)和优雅的关闭nginx pod

    目录 一.系统环境 二.前言 三.pod hook(pod钩子) 四.如何优雅的关闭nginx pod 一.系统环境 服务器版本 docker软件版本 Kubernetes(k8s)集群版本 CPU架 ...

  3. 【Azure 事件中心】Event Hub 无法连接,出现 Did not observe any item or terminal signal within 60000ms in 'flatMapMany' 的错误消息

    问题描述 使用Java SDK连接Azure Event Hub,一直出现 java.util.concurrent.TimeoutException 异常, 消息为:java.util.concur ...

  4. JS数据结构与算法-栈结构

    一.认识栈结构 栈也是一种非常常见的数据结构,并且在程序中的应用非常广泛 数组 我们知道数组是一种线性结构,并且可以在数组的任意位置插入和删除数据. 但是有时候,我们为了实现某些功能,必须对这种任意性 ...

  5. Eclipse Python IDE安装

    时隔一年,曾经的AI工程师微专业课程也忘了大半,如今终于有闲心重温人工智能的相关知识与项目.先从Eclipse安装开始. 首先下载JDK,进入JDK官网下载最新版本的JDK并安装:https://ww ...

  6. C#使用GDI+同时绘制图像和ROI在picturebox上

    Bitmap bmp; /// <summary> /// 绘制图像 /// </summary> /// <param name="g">Gr ...

  7. 软件开发-客观综合(GO)

    1 对从go源码和汇编源码生成可执行程序的过程,下面描述错误的是() ​A. 使用go tool compile可以将go源码编译成目标文件 B. 使用go tool asm可以将go源码编译成汇编代 ...

  8. hwlog--logger.go

    // Copyright(C) 2021. Huawei Technologies Co.,Ltd. All rights reserved.// Package hwlog provides the ...

  9. 谈软件-Java重构案例之Switch_Statements

    1.软件重构,大量swich语句如何重构 2.使用 ide 使用 快捷键ctrl+alt+shift+T调出重构菜单,选择method对之前的for循环重构一个method 3.得到一个新的方法,使用 ...

  10. Android网络请求(终) 网络请求框架Retrofit

    Android网络请求(终) 网络请求框架Retrofit Retrofit底层是由OkHttp封装的,Retrofit对于注解的使用十分频繁,所以不了解注解的同学们可以去查查资料什么的. 这里有一个 ...