双倍经验题

由于我先做的 P6754,所以一切思路基于 P6754 的题目

“ P6754 这题就是 P3413 的究极弱化版 ” --By Aliemo.


P6754 Description

在给定的 \([a,b]\) 区间内求长度 \(\ge\) \(2\) 的非回文串的个数


Solution

设 \(f[i][j][k]\) 表示长度为 \(i\),最高位为 \(j\) ,次高位为 \(k\) 的非回文串的个数

显然有状态转移方程式

\[f[i][j][k]=\sum_{j/k/l=0}^9f[i-1][k][l]\mid j!=k\&\&j!=l\&\&k!=l
\]

对于答案的统计,就是在求出所有的非回文串个数后,通过给定的边界来判断

对于 \(ans_{l,r}\) 可以转化为 \(ans_{1,r}-ans_{1,l-1}\)


注意,本题的求解,对于区间端点的处理,最好将其转化为字符串操作

便于求非回文串的个数

像这样

for(int i = len;i >= 1;i --) {
a[i] = x[len - i] - '0';
sum = sum * 10 + a[i];
}

其他的注意事项放在代码里


Code

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cstring>
#define int long long
#define rr register using namespace std; char A[1010],B[1010];
int f[1010][20][20];
int a[1010]; int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') w=1;ch=getchar();}
while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
return s*w;
} void init(){
for(rr int i=2;i<=1000;i++)
for(rr int j=0;j<=9;j++)
for(rr int k=0;k<=9;k++){
if(j==k) continue;
for(rr int l=0;l<=9;l++)
if(k!=l&&j!=l) f[i][j][k]+=f[i-1][k][l];//
if(i==2) f[i][j][k]++;
}
} int solve(char x[]){
bool t=1;memset(a,0,sizeof a);
int ans=0,cnt=0,sum=0,len=strlen(x),ll1=-1,ll2=-1;
for(rr int i=len;i>=1;i--){a[i]=x[len-i]-'0';sum=sum*10+a[i];}
sum++;ans+=10;if(len==1) return sum;//长度为 1 的 10 个数直接加//如果长度为 1 ,不符合规定
for(rr int i=2;i<len;i++)
for(rr int j=1;j<=9;j++)//排除前导 0
for(rr int k=0;k<=9;k++)
ans+=f[i][j][k];
for(rr int i=len;i>=2;i--){
for(rr int j=0;j<a[i];j++){
if(i==len&&j==0) continue;
for(rr int k=0;k<=9;k++)
if(j!=k&&ll1!=k&&ll1!=j&&ll2!=j) ans+=f[i][j][k];
}
if(ll1==a[i]||ll2==a[i]){t=0;break;}//判断前一位与前两位
ll2=ll1;ll1=a[i];
}
if(t==1)for(rr int i=0;i<=a[1];i++)if(i!=ll1&&i!=ll2)ans++;//最后一位单独处理
return ans;
} signed main(){
init();cin>>A;cin>>B;
int Ans=solve(B)-solve(A);
int len=strlen(A),vis=0;
for(rr int i=1;i<len;i++)
if(A[i]==A[i-1]||(A[i]==A[i-2]&&i>1)){vis=1;break;}
if(!vis) Ans++;printf("%lld",Ans);
return 0;
}


P3413 Description

在给定的 \([a,b]\) 区间内求长度 \(\ge\) \(2\) 的非回文串的个数


Solution

按照上面的思路,比较两位上相同的

比较麻烦

换个角度,如果用总串数减去非回文串数,那不就是回文串数了


思考过程与原理同上

注意取模

代码一改就行


Code

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cstring>
#define int long long
#define rr register
#define Mod 1000000007 using namespace std; char A[1010],B[1010];
int f[1010][20][20];
int a[1010]; int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') w=1;ch=getchar();}
while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
return s*w;
} void init(){
for(rr int i=2;i<=1000;i++)
for(rr int j=0;j<=9;j++)
for(rr int k=0;k<=9;k++){
if(j==k) continue;
for(rr int l=0;l<=9;l++)
if(k!=l&&j!=l) f[i][j][k]=(f[i][j][k]+f[i-1][k][l])%Mod;
if(i==2) f[i][j][k]=(f[i][j][k]+1)%Mod;
}
} int solve(char x[]){//sum 统计总串数,减去 ans 即可
bool t=1;memset(a,0,sizeof a);
int ans=0,cnt=0,sum=0,len=strlen(x),ll1=-1,ll2=-1;
for(rr int i=len;i>=1;i--){a[i]=x[len-i]-'0';sum=(sum*10+a[i])%Mod;}
sum++;ans+=10;if(len==1) return 0;
for(rr int i=2;i<len;i++)
for(rr int j=1;j<=9;j++)
for(rr int k=0;k<=9;k++)
ans=(ans+f[i][j][k])%Mod;
for(rr int i=len;i>=2;i--){
for(rr int j=0;j<a[i];j++){
if(i==len&&j==0) continue;
for(rr int k=0;k<=9;k++)
if(j!=k&&ll1!=k&&ll1!=j&&ll2!=j) ans=(ans+f[i][j][k])%Mod;
}
if(ll1==a[i]||ll2==a[i]){t=0;break;}
ll2=ll1;ll1=a[i];
}
if(t==1)for(rr int i=0;i<=a[1];i++)if(i!=ll1&&i!=ll2)ans=(ans+1)%Mod;
return (sum-ans+Mod)%Mod;
} signed main(){
init();cin>>A;cin>>B;
int len=strlen(A),Ans=solve(B)-solve(A);
for(rr int i=1;i<len;i++)
if(A[i]==A[i-1]||(A[i]==A[i-2]&&i>1)){Ans=(Ans+1)%Mod;break;}
printf("%lld",(Ans+Mod)%Mod);
return 0;
}

洛谷P3413 P6754的更多相关文章

  1. 洛谷P3413 SAC#1 - 萌数 题解 数位DP

    题目链接:https://www.luogu.com.cn/problem/P3413 题目大意: 定义萌数指:满足"存在长度至少为2的回文子串"的数. 求区间 \([L,R]\) ...

  2. [洛谷P3413]SAC#1 - 萌数

    题目大意:求$[l,r](0\leqslant l<r< 10^{1001})$中存在长度至少为$2$的回文串的数字数 题解:数位$DP$,发现如果有回文串,若长度为偶数,一定有两个相同的 ...

  3. 洛谷P3413 SAC#1 - 萌数(数位dp)

    题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的.只有满足“存在长度至少为2的回文子串”的数是萌的——也就是说,101是萌的,因为101本身就是一个回文数:1 ...

  4. 洛谷 P3413 SAC#1 - 萌数

    题意简述 求l~r之间存在长度至少为2的回文子串的正整数的个数 题解思路 数位DP 注意到有偶数长度的回文串必有长度为2的回文串,有奇数长度的回文串必有长度为3的回文串 所以只需判断与前一位,前两位是 ...

  5. 【洛谷P3413】萌数

    题目大意:求区间 [l,r] 内萌数的个数,其中萌数定义为数位中存在长度至少为 2 的回文子串的数字. 题解:l, r 都是 1000 位级别的数字,显然是一道数位 dp 的题目,暴力直接去世. 发现 ...

  6. 洛谷$P3413$ 萌数 $SAC\#1$ 数位$dp$

    正解:数位$dp$ 解题报告: 传送门! 非常套路的数位$dp$,,,?打起来就很爽昂,,,不要脑子,我就很爱嘻嘻嘻 然后$[l,r]$这种问题不显然考虑套路地搞成$[1,l-1]$和$[1,r]$嘛 ...

  7. 洛谷 P3413 【萌数】

    敲完这篇题解,我就,我就,我就,嗯,好,就这样吧... 思路分析: 首先我们要知道一个回文串的性质--假如说一个[l-1,r+1]的串是回文的,那么[l,r]一定也是回文的. 所以我们只要记录前一个数 ...

  8. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  9. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

随机推荐

  1. [leetcode]54. Spiral Matrix2生成螺旋数组

    import java.util.Arrays; /** * Created by lvhao on 2017/7/6. * Given an integer n, generate a square ...

  2. JavaSwing实现的文本比较软件

    先看效果:截图1 截图2: 实现思路: 1.界面UI设计 2.功能点 : a 打开文件进行比较    b 粘贴内容进去比较   c 提示帮助  d 窗口可以任意拖动 3.文本比较算法  java类 : ...

  3. Vue2+Koa2+Typescript前后端框架教程--05Sequelize的使用(ORM)

    本篇开始分享Node.js后端服务开发中对于数据结构ORM的实现,主要使用的技术栈是:Sequelize. 上一篇文章中讲到班级管理的数据结构:ID,班级名称,班级编码,班主任ID,使用的数据库是My ...

  4. 修改postman工具的代码生成工具让它锦上添花

    @font-face { font-family: octicons-link; src: url("data:font/woff;charset=utf-8;base64,d09GRgAB ...

  5. python+sklearn+kaggle机器学习

    python+sklearn+kaggle机器学习 系列教程 0.kaggle 1. 初级线性回归模型机器学习过程 a. 提取数据 b.数据预处理 c.训练模型 d.根据数据预测 e.验证 今天是10 ...

  6. 关于 C# DataSet.ReadXml 无法获取Xml数据的问题解析

    首先这次遇到问题的是,C# Winform 项目中新建的数据集 IDE 是 VS2013 调用如下: private void Form1_Load(object sender, EventArgs ...

  7. Web Service 服务无法连接Oracle数据库

    这个问题之前部署就遇到过,但是后来忘了,所以记录一下吧. 我部署Web Service服务的时候,服务没法正常运行,与Oracle数据库无法正常通信. 检查了数据库连接字没有任何问题,写了个测试接口, ...

  8. 号称能将STW干掉1ms的Java垃圾收集器ZGC到底是个什么东西?

    ZGC介绍 ZGC(The Z Garbage Collector)是JDK 11中推出的一款追求极致低延迟的实验性质的垃圾收集器,它曾经设计目标包括: 停顿时间不超过10ms: 停顿时间不会随着堆的 ...

  9. python学习笔记 | 顺序表的常规操作

    ''' @author: 人人都爱小雀斑 @time: 2020/3/11 8:46 @desc: 顺序表的相关操作 ''' class SequenceList: def __init__(self ...

  10. 立完flag,你可能需要对flag进行量化

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师. 官方网站:devui.design Ng组件库:ng-devui(欢 ...