题目链接:Problem - B - Codeforces

样例输入:

5
1
1
2
01
3
100
4
1001
5
11111

样例输出:

1
3
4
8
5

题意:多组测试,每次给定一个n,代表字符串的长度,然后给定一个长度为n的字符串,字符串中的每个字符为0或者1,我们可以对一个字符串进行操作,每次可以把01变成1或者把10变成0,然后问我们在这个字符串中有多少个子串可以经过若干次操作变为一个数。

举个例子比如100,首先1,0,0三个单独可以作为一个子串,其次100整体可以作为一个子串,因为100->10->0,所以对于100共有4个子串可以经过若干次操作变为一个数,而对于1001的话就有

1,0,0,1,10,01,001,1001这8个子串满足题意

这个题有两种做法,先来说一下比较简单的做法:

假如第i个数字与第i-1个数字不同,那么我们直接把答案+i就行,因为以第i个数字结尾向前扩展任意长度的子串都是满足题意的,为什么会这样呢?给大家举个例子大家应该就明白了:

比如序列是xxxxxxxxxxxx01,我们可以通过若干次操作把前面的x全部变成0,因为假如前面是0那就不用操作,如果前面是1,那我们可以用倒数第二个数0和前面的数组成10然后合成0重复这样的操作就可以使得所有的x变为0,那么就成为了00……01的这种形式,然后就可以直接合并成1

同理假如序列是xxxxxxxxxxxx10,我们可以通过若干次操作把前面的x全部变成1,因为假如前面是1那就不用操作,如果前面是0,那我们可以用倒数第二个数1和前面的数组成01然后合成1重复这样的操作就可以使得所有的x变为1,那么就成为了11……10的这种形式,然后就可以直接合并成0

如果要是当前位和上一位是相同的,因为01->1,10->0所以我们无论怎样操作最后都无法消成一个数,所以只需要把答案+1即可,因为只有把当前这一个字符作为子串才是满足题意的。

代码实现很简单,注意ans开long long:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
const int N=2e5+10;
char s[N];
int main()
{int T;scanf("%d",&T);while(T--){int n;scanf("%d%s",&n,s+1);long long ans=1;for(int i=2;i<=n;i++){if((s[i]-'0')^(s[i-1]-'0')) ans+=i;else ans+=1;}printf("%lld\n",ans);}return 0;
} 

下面来说一种动态规划的解决方法,因为一开始没有想到上面的解法,就用动态规划求解的。

设:

f[i][0]代表以第i个数结尾形成一个0的子串数目

f[i][1]代表以第i个数结尾形成一个1的子串数目

f[i][2]代表以第i个数结尾形成连续两个及以上0的子串数目

f[i][3]代表以第i个数结尾形成连续两个及以上1的子串数目

知道了状态表示,状态转移方程就比较容易推导了,下面是分析思路:

假如当前位是0,那么一定有f[i][1]=f[i][3]=0,当前位为0就代表着以当前位作为结尾形成的子串的末尾一定不可能是1,那么f[i][0]=1+f[i-1][1]+f[i-1][3]就是前面的1个1或者若干个1加上当前位的0组成一个0,f[i][2]=f[i-1][2]+f[i-1][0],当前的若干个0是由前i-1位中的若干个0或者1个0来组成。

同理,假如当前位是1,那么一定有f[i][0]=f[i][2]=0,当前位为1就代表着以当前位作为结尾形成的子串的末尾一定不可能是0,那么f[i][1]=1+f[i-1][0]+f[i-1][2]就是前面的1个0或者若干个0加上当前位的1组成一个1,f[i][3]=f[i-1][3]+f[i-1][1],当前的若干个1是由前i-1位中的若干个1或者1个1来组成。

分析到这,状态转移方程就推导出来了,结果就是每一位字符作为结尾的子串经过操作后能够形成一个数的数目和

下面是代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
const int N=3e5+10;
char s[N];
int f[N][4];//f[i][0/1/2/3]代表以第i个数结尾形成一个0/1/0……0/1……1的方案数
int main()
{int T;cin>>T;while(T--){int n;scanf("%d%s",&n,s+1);long long ans=0;for(int i=1;i<=n;i++){f[i][0]=f[i][1]=f[i][2]=f[i][3]=0;if(s[i]=='0'){f[i][0]=1+f[i-1][1]+f[i-1][3];f[i][2]=f[i-1][2]+f[i-1][0];}else{f[i][1]=1+f[i-1][0]+f[i-1][2];f[i][3]=f[i-1][3]+f[i-1][1];}ans+=f[i][0]+f[i][1];}printf("%lld\n",ans);} return 0;
}

(Codeforces800Div2)B. Paranoid String(思维/动态规划)相关推荐

  1. CodeForces - 1535C Unstable String(思维)

    题目链接:点击查看 题目大意:规定一个字符串将问号都替换成 000 或 111 后满足 010101 交替的话,该字符串是合法的,现在给出一个长度为 nnn 的字符串,求合法子串的个数 题目分析:两种 ...

  2. Educational Codeforces Round 73 (Rated for Div. 2) E. Game With String 思维博弈 好题(2500)

    传送门 文章目录 题意: 思路: 题意: 思路: 我们将每一段...拿出来看成若干段,将其分成以下四种情况: (1)len<b(1)len<b(1)len<b (2)b≤len< ...

  3. B. A Perfectly Balanced String? 思维 vector小技巧

    链接:https://codeforces.com/contest/1673/problem/B 思路:让两个相同字符串的下标之差与字符种类作比较,若前者小于后者,则肯定"no"( ...

  4. Leetcode动态规划部分典型题目分类及总结

    参考内容 https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong- ...

  5. CF构造思维题练习(1200-1400)

    目录 CF1706A Another String Minimization Problem 1 CF1705B Mark the Dust Sweeper 2 CF1700B Palindromic ...

  6. leetcodeLCP 19. 秋叶收藏集/动态规划

    文章目录 题目: 基本思想:动态规划 题目: 小扣出去秋游,途中收集了一些红叶和黄叶,他利用这些叶子初步整理了一份秋叶收藏集 leaves, 字符串 leaves 仅包含小写字符 r 和 y, 其中字 ...

  7. LeetCode 371. 两整数之和(异或操作) / 639. 解码方法 II(动态规划)/ 437. 路径总和 III

    371. 两整数之和 2021.9.26 每日一题 题目描述 给你两个整数 a 和 b ,不使用 运算符 + 和 - ​​​​​​​,计算并返回两整数之和. 示例 1: 输入:a = 1, b = 2 ...

  8. 2022-7-20 学习日记(11th day)String

    目录 String类 String的方法: equals方法: length方法: indexOf方法: 练习: substring方法: 转大写:toUpperCase() 转小写:toLowerC ...

  9. LeetCode动态规划基础题-总结(超级长文)

    前言 五一留校,要不学习一下,整理了一下之前学习的动态的笔记~- -_--- 这部分的题目 确实很有质量的呀,认真看完,会有收获的啦. 感谢代码随想录.LeetCode 真是非常好的练习平台和习题讲解 ...

  10. Java动态规划算法从入门的到熟练

    文章目录 一.动态规划 1. 定义 2. 基本思想和策略 3. 解题思路 4. 使用情况 二.算法笔记 509. 斐波那契数 1137. 第 N 个泰波那契数 70. 爬楼梯 746. 使用最小花费爬 ...

最新文章

  1. [Linux]VI相关操作
  2. mysql通用分页_MySQL海量数据的通用存储过程分页代码
  3. Android --- 解决 cannot connect to daemon at tcp:5037: cannot connect to 127.0.0.1:5037: 由于目标计算机积极拒绝,无
  4. Apache CXF实现WebService发布和调用
  5. 如何理解“不要通过共享内存来通信,而应该通过通信来共享内存”?
  6. 10G_Ethernet_01 万兆以太网设计引言
  7. 使用Spring boot,Thymeleaf,AngularJS从零开始构建一个新的Web应用程序-第1部分
  8. UVA1262Password(第K字典序)
  9. 2021-5-18大搜车
  10. c++用牛顿法开多次根_望远镜的历史之三:大神出世,改变望远镜历史的竟然是牛顿...
  11. 网站页面间脚本传值 sessionStorage
  12. utilities——C++常用仿函数(二)
  13. vb c语言入门教程,c语言和vb哪个简单
  14. LeapFTP 显示服务器端文件名乱码问题处理
  15. Edwin windows下基本命令:
  16. 并发编程-Semaphore,CycliBarrier,CountDownlatch类的使用
  17. geany执行python闪退_说说如何使用 Geany 编译与执行 Python
  18. 【大数据千人会微信群20140827期交流纪要】傅志华-大数据如何在企业落地
  19. scrum认证费用_如何获得专业Scrum大师的认证-快速和慢速方式
  20. 《自动化学报》踩坑心得

热门文章

  1. axis2 webservice客户端最少jar
  2. bittorrent+sync+java_使用BitTorrent-Sync实现双机文件双向同步
  3. 2021阿里淘系工程师推荐书单
  4. 【https】对称加密与非对称加密再理解
  5. web大作业介绍自己的家乡_【天成好作文】胡缤云 二十年后的家乡
  6. 团队想招人,如何说服公司?写一封这样的人员招聘申请邮件,再看效果!
  7. 电脑微软商店消失解决办法
  8. 职业规划-三大职业生涯阶段
  9. 借助Hugo和Academic主题在github.io建立个人网站
  10. typora 编辑器菜单栏不见了:打开了一体化模式