Balance CodeForces - 17C

PIC17CXXX软浮点库实现:IEEE 754标准在8位MCU上的软件模拟与优化 在嵌入式系统开发中,浮点数运算对于处理传感器数据、实现控制算法至关重要。IEEE 754标准定义了浮点数的表示与运算规则,为高精度计算提供了基础。在没有硬件浮点单元(FPU)的微控制器上,通过软件模拟实现浮点运算,即软浮点(Soft-float),成为扩展其数学处理能力的关键技术。其原理是将浮点数拆解为符号、指数、尾数域,利用处理器的整数运算单元(如ALU)执行位操作和算术运算来模拟浮点操作。这项技术的核心价值在于,能在资源受限的嵌入式平台上,为复杂算法(如滤波、坐标变换)提供必要的计算精度与动态范围,同时 阅读详情

Balance

CodeForces - 17C

Nick likes strings very much, he likes to rotate them, sort them, rearrange characters within a string... Once he wrote a random string of characters a, b, c on a piece of paper and began to perform the following operations:

  • to take two adjacent characters and replace the second character with the first one,
  • to take two adjacent characters and replace the first character with the second one

To understand these actions better, let's take a look at a string «abc». All of the following strings can be obtained by performing one of the described operations on «abc»: «bbc», «abb», «acc». Let's denote the frequency of a character for each of the characters a, b and c as the number of occurrences of this character in the string. For example, for string «abc»: |a| = 1, |b| = 1, |c| = 1, and for string «bbc»: |a| = 0, |b| = 2, |c| = 1.

While performing the described operations, Nick sometimes got balanced strings. Let's say that a string is balanced, if the frequencies of each character differ by at most 1. That is  - 1 ≤ |a| - |b| ≤ 1,  - 1 ≤ |a| - |c| ≤ 1 и  - 1 ≤ |b| - |c| ≤ 1.

Would you help Nick find the number of different balanced strings that can be obtained by performing the operations described above, perhaps multiple times, on the given string s. This number should be calculated modulo 51123987.

Input

The first line contains integer n (1 ≤ n ≤ 150) — the length of the given string s. Next line contains the given string s. The initial string can be balanced as well, in this case it should be counted too. The given string s consists only of characters a, b and c.

Output

Output the only number — the number of different balanced strings that can be obtained by performing the described operations, perhaps multiple times, on the given string s, modulo 51123987.

Example
Input
4
abca
Output
7
Input
4
abbc
Output
3
Input
2
ab
Output
1
Note

In the first sample it is possible to get 51 different strings through the described operations, but only 7 of them are balanced: «abca», «bbca», «bcca», «bcaa», «abcc», «abbc», «aabc». In the second sample: «abbc», «aabc», «abcc». In the third sample there is only one balanced string — «ab» itself.

代码转载至: http://blog.youkuaiyun.com/Yunyouxi/article/details/24009567


题目意思
给出一个最多150字符长的只有a或b或c组成的字符串
对于每个操作可以把前面一个字符变成后面一个字符或者把后面的一个字符变成前面一个字符 
即可以执行赋值语句 str[i+1] = str[i]; 或者 str[i] = str[i+1];
如果原 字符串在执行若干次操作后变成一个a,b,c的字符数量相互不超过1的 字符串, 那么称得到的串为一个合法串
问合法串有多少个

例如输入字符串 aaacb 其中a有3个,b有1个,c有1个 3-1>1 不合法 
但是可以把  第3个a变成 c -> aaccb a有2个,b有1个,c有2个, 相互之间的数量都不超过1 所以 aaccb 就是一个合法的串

解题方法
假设输入的字符串是 A, 字符串 A'是 A串的相同字符压缩成一个后的结果 (例如 aacbbb 压缩成 acb)
假设一个合法串B, B'是B压缩后的字符串 
这时会发现 如果 B 是由 A 经过若干次操作得到的结果, 那么 B' 是 A'的一个子序列
如果 B' 是 A' 的一个子序列, 那么说明 B 能从 A 通过若干次操作得到

这样很自然可以想到 如果用一个数组 dp[i] 表示以 A'中的第 i 个字符为结尾的串的数量
由于题目要求字符a, b, c的数量相互不超过1 所以要同时记录字符a, b, c使用了的数量即
状态 dp[i][na][nb][nc] 表示 以 A'中第i个字符为结尾的字符a数量为na, 字符b数量为nb, 字符c数量为nc的字符串的数量
由于A'中只有排在前面的字符才能更新后面的字符所以不断用当前状态去更新后面的状态 当枚举到后面的状态时该状态已经是最优的了
更新时用 完全背包 的思想, 即可以在当前状态后面加任意个的a 或 b 或 c (详情看代码)
if(构造的下一个字符是a) dp[next[i]][na+1][nb][nc] += dp[i][na][nb][nc]; next[i]表示 满足条件(A'[j] == 'a' && j >= i)中最小的 j 
if(构造的下一个字符是b) dp[next[i]][na][nb+1][nc] += dp[i][na][nb][nc]; next[i]表示 满足条件(A'[j] == 'b' && j >= i)中最小的 j 
if(构造的下一个字符是c) dp[next[i]][na][nb][nc+1] += dp[i][na][nb][nc]; next[i]表示 满足条件(A'[j] == 'c' && j >= i)中最小的 j
为什么是最小的 j ? 如果不是最小的 j 是不是会使一部分字符浪费了?
由于要求合法串的a,b,c字符数量相互不超过1 如果字符串长度 n % 3 == 0 则a,b,c字符数量均为 n/3 
                                   如果字符串长度 n % 3 == 1 则a,b,c字符数量可能为 n/3+1,n/3,n/3 或 n/3,n/3+1,n/3 或 n/3,n/3,n/3+1
                             如果字符串长度 n % 3 == 2 则a,b,c字符数量可能为 n/3,n/3+1,n/3+1 或 n/3+1,n/3,n/3+1 或 n/3+1,n/3+1,n/3
即 na, nb, nc的最大值只是50
所以时间复杂度大约为 150*50*50*50 = 18750000 不会超时

code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int MAXN = 1e3 + 10;
const int MOD = 51123987;
char str[MAXN];
char s[MAXN];
int dp[200][53][53][53];
int nex[200][3];
int main(){
    int n;
    while(~scanf("%d",&n)){
        memset(dp,0,sizeof(dp));
        scanf("%s",str);
        int k = 0;
        s[k++] = str[0];
        for(int i = 1; i < n; i++){
            if(str[i] != str[i-1])
                s[k++] = str[i];
        }
        memset(nex,-1,sizeof(nex));
        for(int i = 0; i < k; i++){
            for(int j = i; j < k; j++){
                if(s[j] == 'a' && nex[i][0] == -1) nex[i][0] = j;
                if(s[j] == 'b' && nex[i][1] == -1) nex[i][1] = j;
                if(s[j] == 'c' && nex[i][2] == -1) nex[i][2] = j;
            }
        }
        int tn = n / 3 + 1;
        dp[0][0][0][0] = 1;
        for(int i = 1; i <= k; i++){
            for(int A = 0; A <= tn; A++){
                for(int B = 0; B <= tn; B++){
                    for(int C = 0; C <= tn; C++){
                        if(dp[i-1][A][B][C] == 0) continue;
                        int dex = nex[i-1][0];
                        if(dex != -1){
                            dp[dex][A+1][B][C] += dp[i-1][A][B][C];
                            dp[dex][A+1][B][C] %= MOD;
                        }
                        dex = nex[i-1][1];
                        if(dex != -1){
                            dp[dex][A][B+1][C] += dp[i-1][A][B][C];
                            dp[dex][A][B+1][C] %= MOD;
                        }
                        dex = nex[i-1][2];
                        if(dex != -1){
                            dp[dex][A][B][C+1] += dp[i-1][A][B][C];
                            dp[dex][A][B][C+1] %= MOD;
                        }
                    }
                }
            }
        }
        int res = 0;
        if(n % 3 == 0){
            for(int i = 0; i < k; i++){
                res += dp[i][n/3][n/3][n/3];
                res %= MOD;
            }
        }
        else if(n % 3 == 1){
            for(int i = 0; i < k; i++){
                res += dp[i][n/3+1][n/3][n/3];
                res %= MOD;
                res += dp[i][n/3][n/3+1][n/3];
                res %= MOD;
                res += dp[i][n/3][n/3][n/3+1];
                res %= MOD;
            }
        }
        else{
            for(int i = 0; i < k; i++){
                res += dp[i][n/3+1][n/3+1][n/3];
                res %= MOD;
                res += dp[i][n/3+1][n/3][n/3+1];
                res %= MOD;
                res += dp[i][n/3][n/3+1][n/3+1];
                res %= MOD;
            }
        }
        printf("%d\n",res);
    }
    return 0;
}

IL-17C靶点全解析:中和抗体SIM0543的实验设计与应用指南 炎症和自身免疫疾病研究离不开对抗体工具的深入理解。IL-17家族在炎症信号传导中扮演关键角色,其中IL-17C作为一种主要由上皮细胞表达的细胞因子,通过IL-17RA/IL-17RE受体复合物激活NF-κB和MAPK通路,形成正反馈环路,参与银屑病、炎症性肠病等疾病的病理过程。中和抗体通过特异性阻断配体与受体结合,为解析靶点功能和验证病理机制提供了重要手段。在体外细胞实验和动物疾病模型中,合理设计浓度梯度、设置同型对照、检测下游炎症因子,是获得可靠数据的基础。围绕重组抗人IL-17C单克隆抗体SIM0543 阅读详情

相关推荐

基于MPC17C724与HCS08 MCU的紧凑型步进电机驱动方案详解

在嵌入式系统与自动化控制领域,电机驱动是连接数字指令与物理运动的核心环节。其基本原理是通过微控制器(MCU)产生控制信号,经由功率驱动电路(如H桥)来精确调节电机的转向、速度与位置。这种技术方案的价值在于能够以极低的成本和紧凑的尺寸,实现对执行机构的精准闭环或开环控制,广泛应用于消费电子、小型自动化设备及精密仪器中。其中,飞思卡尔(现NXP)的MPC17C724双H桥驱动器与HCS08系列8位MCU的组合,便是一个经典的工程实践案例。该方案充分利用了MPC17C724高集成度、内置防直通保护等特性,与HCS

weixin_30664615的博客 1912

【codeforces 17C】Balance

题目:Balance 题意:        计数类DP。        给出一个长度为n的只由a,b,c组成的字符串,每次操作可以把一个字母变成其相邻的某个字母,定义一个字符串是平衡的当且仅当三个字母出现的次数相差不超过1,问这个字符串经过若干次操作可以变成多少个不同的平衡的字符串。 解析:        参见CodeForces 17 C.Balance(dp)        重点在...

ETO的博客 38万+

告别sgmediation!Stata中介效应分析新选择:mediation包完整操作指南

本文介绍了Stata中介效应分析从传统sgmediation命令向mediation包的范式升级。重点阐述了如何使用medeff和medsens命令进行更严谨的因果推断,并执行关键的敏感性分析,以评估结果对未观测混杂的稳健性,为学术研究提供发表级的分析工具。

redis7keeper的博客 1157

17C 颜色与物质浓度辨识做题笔记

关键词:多元线性回归、非线性、层次分析、相关性分析、变异系数、异常值处理、优劣评价。总结:第一二问相关性+多元回归 第三问 看变化维度数和样本数进行效果检验。使用权重标准差和 除以 数据量 定义为数据优劣度(每个样本各特征的平均偏移)数据优劣评价:间距、离散程度、样本量等,最好能用指标进行综合评价(论文3)第二题:建立颜色读数和物质浓度的数学模型,并给出模型的误差分析。第一题:建立颜色-浓度模型,对五组数据优劣进行评估,给出准则。第三题:探讨数据量和颜色维度对模型的影响。回归效果不好说明数据不好…

LZM_SZU的博客 78万+

SAP 发货在途库存管理:POD确认差异下的2种后续调整方案对比

本文详细解析了SAP发货在途库存管理中POD确认差异后的财务调整方案,对比了移动类型417和555 T两种处理方式的适用场景及财务影响。通过实际案例说明如何优化POD流程,减少库存差异损失,提升供应链管理效率。特别适合SAP SD模块用户及供应链管理人员参考。

chiman6219的博客 393

uniapp+华为HBuilder X 4.29跑鸿蒙模拟器报错没有签名授权

uniapp+华为HBuilder X 4.29跑鸿蒙模拟器报错没有签名授权报错信息11:39:47.976 安装 .hap 到鸿蒙设备 ...11:39:48.517 运行所需的权限没有签名授权,请参考 配置文档11:39:48.517 安装失败。

weixin_66071584的博客 1350

CodeForces 17C Balance (DP)

题目类型  DP 题目意思 给你一个最多100字符长的字符串, 问是否满足这个格式 -> @[/resource] 其中 是一个只包含 字母或数字或下划线 的长度为 1 - 16 的字符串      是一个由 若干个以字符 '.' 进行分隔的单词 组成的长度为 1 - 32的字符串, 其中单词的限制和 一样      resource的限制与 一样  [/resource] 的

yunyouxi0's blog 7万+

睿尔曼复合机器人之底盘操作流程

控制键”按下后,可在键盘上通过‘i’(向前),‘k’(向后),‘j’(向左旋转),‘l’(向右旋转)四个按键对底盘进行运动控制。选中禁⾏线功能后,使⽤⿏标在界⾯内点击选择起点,继续在其他地⽅点击,两点之间会连成⼀条线,可以进⾏多次连续点击,形成连续线条。4)扫图完成后,软件会重新启动,返回到监控页面,点击“激光”可看到当前机器激光扫描的实时数据,在页面上表现为红色边界线,点击菜单栏“控制”键使底盘在一定范围内运动,扫描到尽可能多的边界线,可发现与实际地图的黑色边界线不同,需要进行手动校正。

realman_Rop的博客 1472

CodeForces - 17C Balance【DP】

题目链接:https://codeforces.com/contest/17/problem/C #include <iostream> #include <cmath> using namespace std; static const int MOD=51123987; static const int MAXN=150+10; char s[MAXN]; int p[MAXN][3]; int dp[MAXN][55][55][55]; int n,res; int main(

inv0ker的博客 2万+

生成式引擎优化(GEO)的概念与技术路径

生成式引擎优化(GEO)是针对生成式AI引擎的新型优化策略,旨在提升内容在AI搜索与问答平台中的可见性和可信度。与传统SEO相比,GEO更注重语义理解、知识图谱和多模态生成等技术,通过优化内容的结构化和平台适配性,使品牌信息在生成式AI中更易被采纳和呈现。其核心技术包括语义理解、向量数据库和实时反馈优化等,应用于品牌传播、智能客服和个性化推荐等领域。随着AI技术发展,GEO将向智能化、自动化方向演进,成为内容优化的重要工具。

Baixue5209的博客 1047

加密视频如何破解 如何解除机器码绑定的视频

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 如何破解加密...

Q-980767270的博客 5万+

Codeforces Beta Round #17 C. Balance DP

C. Balance 题目链接http://codeforces.com/contest/17/problem/C 题面Nick likes strings very much, he likes to rotate them, sort them, rearrange characters within a string… Once he wrote a random string of ch

now_ing的博客 396

STM32入门教程:无人机控制

我们将会一步一步引导您完成无人机的控制代码,包括无人机的姿态控制、飞行控制和通信控制等。第三步:配置无人机姿态控制 无人机的姿态控制是指控制无人机在空中的倾斜和转向。为了实现姿态控制,我们需要使用加速度计和陀螺仪传感器来获取无人机的姿态信息,并使用PID控制算法来控制无人机的姿态。在这一步骤中,您需要根据您使用的具体传感器和控制算法的要求进行更详细的配置和编码。在通信控制中,您需要考虑到通信的稳定性和可靠性。第五步:通信控制 无人机的通信控制是指与地面站或其他设备进行通信,传输飞行数据和接收飞行指令。

m0_75244442的博客 747

codeforces 17C Balance(动态规划)

codeforces 17C Balance 题意 给定一个串,字符集{'a', 'b', 'c'},操作是:选定相邻的两个字符,把其中一个变成另一个。可以做0次或者多次,问最后可以生成多少种,使得任意一种字符和其他字符的个数相差都不超过1. 题解 一个生成串压缩之后必定都是初始串的子序列,那么只要能枚举所有子序列,其他的很好搞定。 对于枚举的每个子序列,如果它是由初始串最早能生成的产生,那么肯定...

weixin_30426879的博客 14万+

LPDDR6来了!带你一文看懂它和LPDDR5/5X的差距 + 技术演进逻辑全解析

🧠从速率到架构,从总线宽度到协议设计,LPDDR6 每一个改动都不是拍脑袋做的,它针对的是AI / HPC / 云计算 / 下一代笔记本平台的真实需求。作为工程师的我们,不仅要“用得上”,更要“测得准”,因为没有测试验证,就没有量产落地!🎯LPDDR6不是未来,而是现在进行时!

weixin_43199439的博客 2167

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

CodeForces 17C 平衡字符串(Balance)

CF17C 扎心的题面,考试的时候题面是”相邻字符串”花了两个小时死活没想出,回头看了cf发现tm竟然是“相邻字符”!(雾) 如果cf的题面是正确的,那么这道题就可以轻易地用四维dp完成。定义初始字符串为A,操作后为B,将两者去重(删除相邻的同一种元素)形成子串a和b。手推可得b一定是a的子串(虽然不一定是真子串)。 如上我们可以构造一个长度为n的字符串,要求a、b、c字符个数之差均不超过1...

xyc1719的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[Codeforces 17C] Balance

Brief Introduction: 给定一个仅由abc组成的字符串,每个字符可以向左右延展,求最终新的平衡字符串的个数。 Algorithm: 关键点在于变换前后字符串中字符的相对位置不会发生改变 也就是说,将前后字符串unique后,B是A的子序列 问题转化为求A得子序列数 这样直接使用dp[cur][i][j][k] 配合 next[i][char] 转移即可 不...

weixin_30387339的博客 1051

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

CodeForces - 17C Balance(DP)

Description Nick likes strings very much, he likes to rotate them, sort them, rearrange characters within a string... Once he wrote a random string of characters a, b, c on a piece of paper and b

WZJRJ28 1万+

CodeForces 17 C.Balance(dp)

Description 给出一个长度为nnn的只由a,b,ca,b,ca,b,c组成的字符串,每次操作可以把一个字母变成其相邻的某个字母,定义一个字符串是平衡的当且仅当三个字母出现的次数相差不超过111,问这个字符串经过若干次操作可以变成多少个不同的平衡的字符串 Input 第一行一整数nnn表示字符串长度,之后输入一只由′a′,′b′,′c′′a′,′b′,′c′'a','b','c'组成...

ZSQ 826

Codeforces Beta Round #17 C. Balance (字符串计数 dp)

C. Balance time limit per test 3 seconds memory limit per test 128 megabytes input standard input output standard output Nick likes strings very much, he likes to rotate

To be what you what to be! 1606

CF_17C Balance

cf 17c C. Balance http://codeforces.com/problemset/problem/17/C 题意: 给出一个最多150字符长的只有a、b、c组成的字符串,每次操作可以选择两个连续的字符: 1.把前面一个字符变成后面一个字符 。 2.把后面一个字符变成前面一个字符 。

JFGiGi的博客 11万+
上一篇: Laser CodeForces - 15B
下一篇: Flea CodeForces - 32C (思维)
Guuuuuu老师儿
博客等级 码龄9年 259粉丝 718原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值