首页 > 其他分享 >C-小美的01串翻转_牛客周赛 Round 9

C-小美的01串翻转_牛客周赛 Round 9

时间:2023-08-29 16:33:05浏览次数:44  
标签:子串 周赛 01 int 美的 long 权值 位变

链接:https://ac.nowcoder.com/acm/contest/63869/C
来源:牛客网

题目描述

小美定义一个 01 串的权值为:每次操作选择一位取反,使得相邻字符都不相等的最小操作次数。
例如,"10001"的权值是 1,因为只需要修改一次:对第三个字符取反即可。
现在小美拿到了一个 01 串,她希望你求出所有非空连续子串的权值之和,你能帮帮她吗?

输入描述:

一个仅包含'0'和'1'的字符串,长度不超过 2000。

输出描述:

所有非空子串的权值和。 示例1

输入

10001

输出

8

说明

长度为 2 的子串中,有 2 个"00"的权值是 1。 长度为 3 的 3 个子串权值都是 1。 长度为 4 的 2 个子串权值都是 1。 长度为 5 的 1 个子串权值是 1。 总权值之和为 2+3+2+1=8    

思路:

01字符串s .....,s[i-1],s[i],.....

首先我们定义f[n][2],其中[2]表示状态位,也就是当前第i位变与不变(0表示第i位不变,1表示第i位变)

f[i][0]、f[i][1]其含义分别为以第i个字符结尾的字符串,第i位变的权值和第i位不变的权值

为了缩小问题规模,考虑第i位和第i-1位的情况:

  1. 若s[i]==s[i-1],此时i和i-1这两个之间必须要变一个,可以分为以下两种情况:i不变i-1变;i变i-1不变,状态转移方程如下

    • f[i][0] = f[i-1][1];

    • f[i][1] = f[i-1][0] + 1;

  1. 若s[i]!=s[i-1],此时也可以分为两种情况:i和i-1都不变;i和i-1都变,状态转移方程如下

    • f[i][0] = f[i-1][0];

    • f[i][1] = f[i-1][1] + 1;

初始状态定义为f[i-1][0] = 0;f[i-1][1] = 1;     // 1表示当前为修改所以初始值为1

第i位变与不变的操作次数都能满足要求,由于题目要求选择操作次数最小,所以记录答案时取min(f[i][0],f[i][1]);

然后我们只需要枚举起始下标,记录每次不同起始下标所能求得的权值之和,最后相加即可

我们每次操作都只用到了当前位i和前一位i-1的值,所以对于f[n][2]数组来说我们只要保证当前位的前一位i-1的值是正常的即可,后续操作数据可直接覆盖也无需初始化

Code

#include <bits/stdc++.h>
using namespace std;

int main()
{
    string s;
    cin >> s;
    int n = s.size();
    int f[2001][2];
    long long ans = 0;
    for (int j = 0; j < n; j++)
    {
        long long sum = 0;
        f[j][0] = 0, f[j][1] = 1;
        for (int i = j + 1; i < n; i++)
        {
            if (s[i] == s[i - 1])
            {
                f[i][0] = f[i - 1][1];
                f[i][1] = f[i - 1][0] + 1;
            }
            else
            {
                f[i][0] = f[i - 1][0];
                f[i][1] = f[i - 1][1] + 1;
            }
            sum += min(f[i][0], f[i][1]);
        }
        ans += sum;
    }
    cout << ans << endl;
    return 0;
}

 

         

标签:子串,周赛,01,int,美的,long,权值,位变
From: https://www.cnblogs.com/odd-ryj/p/17665212.html

相关文章

  • BUUCTF [极客大挑战 2019]HardSQL
    判断过滤哪些关键词和字符报错注入报错注入在没法用union联合查询时用,但前提还是不能过滤一些关键的函数。报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这里主要记录一下xpath语法错误和concat+rand()+group_by()导致主键重复xpa......
  • 018-管理后台操作日志功能开发
    1.功能分析1.1.查询列表1.1.1.页面效果1.1.2.功能要求分页查询默认查询10条每页从第1页开始查询日志只提供查询操作搜索条件日志来源:精准搜索请求ip:精准搜索点击搜索按钮是按照录入的搜索条件进行查询数据并渲染点击重置按钮的时候清空搜索条件,并重新渲染数据1.2.插入日志1.2......
  • IPQ4019 IPQ4029 IPQ6010|IIOT|5G and WiFi 6:Application in Business and Industry
    5GandWiFi6:Application inBusinessandIndustryIntroductionAstheworldhurtlestowardsaneraofunprecedenteddigitaltransformation,twotechnologiesstandattheforefront,poisedtoreshapethelandscapeofbusinessandindustry:5GandWiFi6.Th......
  • 016-管理后台导航功能开发
    1.功能分析1.1.查询列表1.1.1.页面效果1.1.2.功能要求分页查询默认查询10条每页从第1页开始查询默认导航信息只提供查询按钮非默认导航提供查询,修改,删除按钮点击新增按钮弹出新增导航页面搜索条件导航名称:支持模糊搜索点击搜索按钮是按照录入的搜索条件进行查询数据并渲染点......
  • 017-管理后台通用js提取
    //定义全局常量,可供全局使用varzhuhuo={config:{},//bootstrap-table属性配置信息options:{},/***参数初始化*/set:function(id){ //判断配置信息里面是否有值,且当前的事件监听不为空if($.tools.getLength(zhuhu......
  • 015-管理后台框架布局搭建
    1.功能分析管理后台我们先看下大体页面布局如下包含左侧菜单栏,头部导航栏,tab窗体,还有内容显示区域,以及页脚.2.基本实现2.1.文件引入2.2.页面引入引入hplus下的index.html2.3.页面调整我们需要对css,js等做调整,可以使用thymeleaf方式引入<!--css相关调整--><linkrel="sho......
  • 01 linux 定时任务之关机
    定时关机例:设置在每天03:00定时关机在Linux系统终端执行以下代码 sudo-s#进入rootsudogedit/etc/crontab#编辑/etc/crontab 在打开的窗口添加以下内容,保存并退出  0003***root/sbin/shutdown-hnow#......
  • HCIE-广域承载解决方案专题01-SR
    HCIE-广域承载解决方案专题01-SR基本概念1SR(SegmentRouting)概述1.1MPLSLDP与RSVP-TE存在的问题MPLSLDPLDP本身并无算路能力,需依赖IGP进行路径计算控制面需要IGP及LDP,设备之间需要发送大量的消息来维持邻居关系及路径状态,浪费了链路带宽及设备资源若LDP与IGP切换过......
  • 洛谷P1013 [NOIP1998 提高组] 进制位
    P1013[NOIP1998提高组]进制位P1013题目传送门这是一道提高+/省选-的蓝题,有亿点点难度,我们先分析一下。分析字母的数量等于进制的大小,判错的时候,可以看一下那个表格右下角的一个等腰三角形,就会发现有一个由两位字母组成的三角形。我们验算一下,对于\(L\),在该三角形的双位字......
  • 洛谷P5865 [SEERC2018] Tree
    P5865[SEERC2018]Tree题目传送门分析本题不难,只要枚举即可。假设两点之间的距离为树的端点,然后再去枚举其他点,符合的加入集合。若黑色点的个数超出了定义个数,那么就更新一遍。最后求最小值。ACCode:#include<bits/stdc++.h>//保命万能头usingnamespacestd;//命名空......